From 1ea15a327092545872b0fb3e0e1cd0edf2b26444 Mon Sep 17 00:00:00 2001 From: Heitor Ramon Ribeiro Date: Mon, 3 Jan 2022 03:43:11 -0300 Subject: [PATCH 001/486] chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process --- .github/workflows/draft-release-pr.yml | 48 ++++++++++++++++++ .github/workflows/merge-release.yml | 49 +++++++++++++++++++ .../{publish.yml => publish-npm.yml} | 0 lerna.json | 3 +- 4 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/draft-release-pr.yml create mode 100644 .github/workflows/merge-release.yml rename .github/workflows/{publish.yml => publish-npm.yml} (100%) diff --git a/.github/workflows/draft-release-pr.yml b/.github/workflows/draft-release-pr.yml new file mode 100644 index 000000000..238db9d58 --- /dev/null +++ b/.github/workflows/draft-release-pr.yml @@ -0,0 +1,48 @@ +name: "Draft new release" + +on: + workflow_dispatch: + inputs: + version: + description: 'The version you want to release.' + required: true + +jobs: + draft-new-release: + name: "Draft a new release" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Initialize mandatory git config + run: | + git config user.name "GitHub actions" + git config user.email noreply@github.com + + - name: Create release branch + run: git checkout -b release/${{ github.event.inputs.version }} + + - name: Bump version in package.json + run: lerna version "${{ github.event.inputs.version }}" --no-git-tag-version --no-changelog --ignore-changes "*/internals/**" -y + + - name: Commit changelog and manifest files + id: make-commit + run: | + git add . + git commit --message "chore: release ${{ github.event.inputs.version }}" + echo "::set-output name=commit::$(git rev-parse HEAD)" + - name: Push new branch + run: git push origin release/${{ github.event.inputs.version }} + + - name: Create pull request + uses: thomaseizinger/create-pull-request@1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + head: release/${{ github.event.inputs.version }} + base: main + title: "chore: release version ${{ github.event.inputs.version }}" + reviewers: ${{ github.actor }} + body: | + Hey @${{ github.actor }}! + Remeber to update this PR with the correct information, before merging it :) diff --git a/.github/workflows/merge-release.yml b/.github/workflows/merge-release.yml new file mode 100644 index 000000000..572bf2d0d --- /dev/null +++ b/.github/workflows/merge-release.yml @@ -0,0 +1,49 @@ +name: "Publish new release" + +on: + pull_request: + branches: + - main + types: + - closed + +jobs: + release: + name: Publish new release + runs-on: ubuntu-latest + if: github.event.pull_request.merged == true + steps: + - name: Extract version from branch name (for release branches) + if: startsWith(github.event.pull_request.head.ref, 'release/') + run: | + BRANCH_NAME="${{ github.event.pull_request.head.ref }}" + VERSION=${BRANCH_NAME#release/} + echo "RELEASE_VERSION=$VERSION" >> $GITHUB_ENV + - name: Extract version from branch name (for hotfix branches) + if: startsWith(github.event.pull_request.head.ref, 'hotfix/') + run: | + BRANCH_NAME="${{ github.event.pull_request.head.ref }}" + VERSION=${BRANCH_NAME#hotfix/} + echo "RELEASE_VERSION=$VERSION" >> $GITHUB_ENV + - name: Create Release + uses: thomaseizinger/create-release@1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + target_commitish: ${{ github.event.pull_request.merge_commit_sha }} + tag_name: ${{ env.RELEASE_VERSION }} + name: ${{ env.RELEASE_VERSION }} + draft: false + prerelease: false + + - name: Merge main into develop branch + uses: thomaseizinger/create-pull-request@1.0.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + head: main + base: develop + title: Merge main into develop branch + body: | + This PR merges the main branch back into develop. + This happens to ensure that the updates that happend on the release branch, i.e. CHANGELOG and manifest updates are also present on the develop branch. diff --git a/.github/workflows/publish.yml b/.github/workflows/publish-npm.yml similarity index 100% rename from .github/workflows/publish.yml rename to .github/workflows/publish-npm.yml diff --git a/lerna.json b/lerna.json index deb185c20..6bd7d296a 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,6 @@ { "useWorkspaces": true, "npmClient": "yarn", - "version": "independent" + "version": "independent", + "ignoreChanges": ["internals/**"] } From 2ea26d481537f591781f628cc59767ff8118e3cc Mon Sep 17 00:00:00 2001 From: Marcin Kwiatkowski Date: Mon, 3 Jan 2022 15:13:32 +0100 Subject: [PATCH 002/486] docs: added roadmap to the docs (#380) closes #323 --- docs/.vuepress/config.js | 1 + docs/guide/roadmap.md | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 docs/guide/roadmap.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 3e4911718..105e1f6ac 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -58,6 +58,7 @@ module.exports = { ['/guide/environments', 'Environments'], ['/guide/functional-catalog', 'Functional catalog'], ['/guide/about', 'About'], + ['/guide/roadmap', 'Roadmap'], ] }, { diff --git a/docs/guide/roadmap.md b/docs/guide/roadmap.md new file mode 100644 index 000000000..d8d0abb94 --- /dev/null +++ b/docs/guide/roadmap.md @@ -0,0 +1,33 @@ +# Roadmap + +The current goal is to release a stable 1.0.0 version by the end of February. Details below. + +## January 2022 + +- finish multi-store functionality +- performance improvements + - analysis + - improve the speed of communication with Magento + - Redis Caching + - CDNs +- Design QA & improvements + +## February 2022 + +- performance improvements + - meet web core vitals or at least 80 score +- Unit & integration tests for crucial functionalities +- quality assurance +- user acceptance tests +- load tests + +### Milestone: Release stable 1.0.0 version by the end of February + +## March 2022 + +- Accessibility tests & improvements +- extensibility + - improve docs + - add the possibility to add plugins + - add the possibility to install external extensions + - theming From 352b658bbef65b1f40eddea3b9c306743d8bfd75 Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Mon, 10 Jan 2022 07:42:10 +0100 Subject: [PATCH 003/486] fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba --- docs/guide/configuration.md | 25 +++++ .../src/composables/useConfig/index.ts | 2 +- .../src/composables/useStore/index.ts | 4 +- .../src/getters/storeConfigGetters.ts | 3 +- packages/composables/src/helpers/isoToCode.ts | 1 + packages/theme/components/AppHeader.vue | 6 +- .../{LocaleSelector.vue => StoreSwitcher.vue} | 94 ++++++------------ packages/theme/components/TopBar.vue | 6 +- .../composables/useMagentoConfiguration.ts | 1 + packages/theme/lang/de.js | 3 + packages/theme/nuxt.config.js | 24 ++--- .../icons/langs/{de-DE.webp => de.webp} | Bin .../icons/langs/{en-US.webp => en.webp} | Bin .../icons/langs/{nl-NL.webp => nl.webp} | Bin 14 files changed, 83 insertions(+), 86 deletions(-) create mode 100644 packages/composables/src/helpers/isoToCode.ts rename packages/theme/components/{LocaleSelector.vue => StoreSwitcher.vue} (68%) create mode 100644 packages/theme/lang/de.js rename packages/theme/static/icons/langs/{de-DE.webp => de.webp} (100%) rename packages/theme/static/icons/langs/{en-US.webp => en.webp} (100%) rename packages/theme/static/icons/langs/{nl-NL.webp => nl.webp} (100%) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md index 75b81c9e7..2e9a24427 100644 --- a/docs/guide/configuration.md +++ b/docs/guide/configuration.md @@ -38,3 +38,28 @@ Then on the `config` folder create a file `dev.json` with your configurations. "nuxtAppPort": 3000 // Define nuxt port } ``` + +## Languages (i18n) + +To properly translate theme content with the usage of i18n library you must add configuration in `nuxt.config.js`. Here is the sample configuration for an English translation. VSF also provides default configuration OOTB which can be overridden if necessary. + +By default VSF will map all locales ISO Codes into a locale code, eg. `en_US` will be mapped into `en` code therefore, to properly link the dictionary to Magento 2 store-view, you must set the locale `code` field to be exactly the same as ISO 639-1 alpha-2 code prefix. Mapping is handled by composable `isoToCode.js` helper function which is the extension point for implementing different strategies. + + +```json +i18n: { + ... + locales: [ + { + code: 'en', // This must match _US from the iso code + label: 'English', + file: 'en.js', // Points to a file in langDir directory + iso: 'en_US', + } + ], + defaultLocale: 'en', + langDir: 'lang/', + }, + ... + }, + ``` \ No newline at end of file diff --git a/packages/composables/src/composables/useConfig/index.ts b/packages/composables/src/composables/useConfig/index.ts index f1fc5c57e..9f2fe39b1 100644 --- a/packages/composables/src/composables/useConfig/index.ts +++ b/packages/composables/src/composables/useConfig/index.ts @@ -4,7 +4,7 @@ import { useConfigFactory, UseConfigFactoryParams } from '../../factories/useCon import { UseConfig } from '../../types/composables'; const factoryParams: UseConfigFactoryParams = { - loadConfig: async (context: Context, params) => { + loadConfig: async (context: Context) => { const { data } = await context.$magento.api.storeConfig(); return data.storeConfig || {}; diff --git a/packages/composables/src/composables/useStore/index.ts b/packages/composables/src/composables/useStore/index.ts index 5722400cd..845a75571 100644 --- a/packages/composables/src/composables/useStore/index.ts +++ b/packages/composables/src/composables/useStore/index.ts @@ -11,7 +11,7 @@ const factoryParams: UseStoreFactoryParams = { cart: useCart(), }; }, - load: async (context: Context, params): Promise => { + load: async (context: Context): Promise => { const { data } = await context.$magento.api.availableStores(); return data.availableStores || []; @@ -21,7 +21,7 @@ const factoryParams: UseStoreFactoryParams = { change: (context: Context, store) => { context.$magento.config.state.setStore(StoreConfigGetters.getCode(store)); context.$magento.config.state.setCurrency(StoreConfigGetters.getCurrency(store)); - context.$magento.config.state.setLocale(StoreConfigGetters.getCurrency(store)); + context.$magento.config.state.setLocale(StoreConfigGetters.getLocale(store)); context.cart.clear(); }, diff --git a/packages/composables/src/getters/storeConfigGetters.ts b/packages/composables/src/getters/storeConfigGetters.ts index e56db255c..31742df78 100644 --- a/packages/composables/src/getters/storeConfigGetters.ts +++ b/packages/composables/src/getters/storeConfigGetters.ts @@ -1,10 +1,11 @@ import { StoreConfig } from '@vue-storefront/magento-api'; +import { isoToCode } from '../helpers/isoToCode'; const getCode = (config: StoreConfig) => config.store_code; const getTitle = (config: StoreConfig) => config.default_title; const getName = (config: StoreConfig) => config.store_name; const getCurrency = (config: StoreConfig) => config.default_display_currency_code; -const getLocale = (config: StoreConfig) => config.locale.replace('_', '-'); +const getLocale = (config: StoreConfig) => isoToCode(config.locale); const allowGuestProductReview = (config: StoreConfig) => config.allow_guests_to_write_product_reviews; const enabledWishlist = (config: StoreConfig) => config.magento_wishlist_general_is_enabled; diff --git a/packages/composables/src/helpers/isoToCode.ts b/packages/composables/src/helpers/isoToCode.ts new file mode 100644 index 000000000..3c2f80496 --- /dev/null +++ b/packages/composables/src/helpers/isoToCode.ts @@ -0,0 +1 @@ +export const isoToCode = (isoLocale: string): string => isoLocale.slice(0, 2); diff --git a/packages/theme/components/AppHeader.vue b/packages/theme/components/AppHeader.vue index 03c1c4802..94c2e0008 100644 --- a/packages/theme/components/AppHeader.vue +++ b/packages/theme/components/AppHeader.vue @@ -28,7 +28,7 @@ /> @@ -94,7 +71,6 @@ import { SfImage, SfButton, SfList, - SfHeading, SfBottomModal, SfCharacteristic, } from '@storefront-ui/vue'; @@ -103,26 +79,18 @@ import { computed, defineComponent, } from '@nuxtjs/composition-api'; -import { useI18n } from '~/helpers/hooks/usei18n'; -import { useMagentoConfiguration } from '~/composables/useMagentoConfiguration'; import { useHandleChanges } from '~/helpers/magentoConfig/handleChanges'; export default defineComponent({ - name: 'LocaleSelector', + name: 'StoreSwitcher', components: { SfImage, SfButton, SfList, - SfHeading, SfBottomModal, SfCharacteristic, }, setup() { - const { - selectedCurrency, - selectedLocale, - } = useMagentoConfiguration(); - const { config, } = useConfig(); @@ -133,25 +101,15 @@ export default defineComponent({ } = useStore(); const { handleChanges } = useHandleChanges(); - - const { - locales, - locale, - } = useI18n(); const isLangModalOpen = ref(false); - const availableLocales = computed(() => [...locales].filter((i) => (Object.keys(i).length > 0 && typeof i === 'object' ? i.code !== locale : i !== locale))); const availableStores = computed(() => stores.value ?? []); return { - availableLocales, availableStores, changeStore, handleChanges, isLangModalOpen, - locale, - selectedCurrency, - selectedLocale, storeConfig: config, storeConfigGetters, storeGetters, @@ -163,7 +121,6 @@ export default defineComponent({ diff --git a/packages/theme/components/TopBar.vue b/packages/theme/components/TopBar.vue index 8acdd2255..ed492730b 100644 --- a/packages/theme/components/TopBar.vue +++ b/packages/theme/components/TopBar.vue @@ -19,7 +19,7 @@ */ --> - + @@ -27,14 +27,14 @@ diff --git a/packages/theme/components/HTMLContent.vue b/packages/theme/components/HTMLContent.vue index 0fcd7f87b..2b5379498 100644 --- a/packages/theme/components/HTMLContent.vue +++ b/packages/theme/components/HTMLContent.vue @@ -1,13 +1,11 @@ diff --git a/packages/theme/nuxt.config.js b/packages/theme/nuxt.config.js index 115a15686..c8250ace4 100755 --- a/packages/theme/nuxt.config.js +++ b/packages/theme/nuxt.config.js @@ -77,22 +77,6 @@ export default () => { ], }, }], - // @core-development-only-start - ['@vue-storefront/nuxt-theme', { - generate: { - replace: { - apiClient: '@vue-storefront/magento-api', - composables: '@vue-storefront/magento', - }, - }, - routes: false, - }], - // @core-development-only-end - /* project-only-start - ['@vue-storefront/nuxt-theme', { - routes: false, - }], - project-only-end */ ['@vue-storefront/magento/nuxt', { i18n: { useNuxtI18nConfig: true, @@ -218,13 +202,14 @@ export default () => { '~/plugins/token-expired', '~/plugins/i18n', '~/plugins/fcPlugin', + '~/plugins/dompurify', ], serverMiddleware: [ '~/serverMiddleware/body-parser.js', ], router: { extendRoutes(routes) { - getRoutes(`${__dirname}/_theme`) + getRoutes() .forEach((route) => routes.unshift(route)); }, }, diff --git a/packages/theme/package.json b/packages/theme/package.json index 2d8dd2044..1f8fbe017 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -38,7 +38,6 @@ "@vue-storefront/magento": "1.0.0-rc.5.4", "@vue-storefront/middleware": "~2.5.4", "@vue-storefront/nuxt": "~2.5.4", - "@vue-storefront/nuxt-theme": "~2.5.4", "convict": "^6.2.1", "convict-format-with-validator": "^6.2.0", "cookie-universal-nuxt": "^2.1.5", diff --git a/packages/theme/pages/Checkout/ThankYou.vue b/packages/theme/pages/Checkout/ThankYou.vue new file mode 100644 index 000000000..84299f5d4 --- /dev/null +++ b/packages/theme/pages/Checkout/ThankYou.vue @@ -0,0 +1,275 @@ + + + + diff --git a/packages/theme/plugins/dompurify.ts b/packages/theme/plugins/dompurify.ts new file mode 100644 index 000000000..891d0a79a --- /dev/null +++ b/packages/theme/plugins/dompurify.ts @@ -0,0 +1,12 @@ +import _unescape from 'lodash.unescape'; +import DOMPurify from 'isomorphic-dompurify'; + +declare module 'vue/types/vue' { + interface Vue { + $dompurify(html: string): string; + } +} + +export default (inject) => { + inject('dompurify', (html: string): string => _unescape(DOMPurify.sanitize(html))); +}; diff --git a/yarn.lock b/yarn.lock index b4cacab4d..4ebb43a97 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4517,16 +4517,6 @@ cors "^2.8.5" express "^4.17.1" -"@vue-storefront/nuxt-theme@~2.5.4": - version "2.5.4" - resolved "https://registry.yarnpkg.com/@vue-storefront/nuxt-theme/-/nuxt-theme-2.5.4.tgz#7a8172836929afaf23825054d954414cf46cb859" - integrity sha512-X+y9eQ+2RSgx3nHUKMKiYUVP+016gxR9CgjD19DIM7Mezy6P6oos7Qbpkjm7yBObfHLl8bo1q8VSmxyVgntRaA== - dependencies: - ejs "^3.0.2" - lodash.debounce "^4.0.8" - lodash.merge "^4.6.2" - vue-lazy-hydration "^2.0.0-beta.4" - "@vue-storefront/nuxt@~2.5.4": version "2.5.4" resolved "https://registry.yarnpkg.com/@vue-storefront/nuxt/-/nuxt-2.5.4.tgz#29d8fc368e66c7e46aed164654a92942208cc08b" @@ -8640,7 +8630,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^3.0.2, ejs@^3.1.6: +ejs@^3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.6.tgz#5bfd0a0689743bb5268b3550cceeebbc1702822a" integrity sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw== From f342eb5a8ac9586f09766ecba17e4d83b4be7c85 Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Tue, 8 Feb 2022 09:39:04 +0100 Subject: [PATCH 100/486] fix(theme): fix dompurify arguments injection (#573) Co-authored-by: Bartosz Herba --- packages/theme/plugins/dompurify.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/theme/plugins/dompurify.ts b/packages/theme/plugins/dompurify.ts index 891d0a79a..d04e72b7d 100644 --- a/packages/theme/plugins/dompurify.ts +++ b/packages/theme/plugins/dompurify.ts @@ -7,6 +7,6 @@ declare module 'vue/types/vue' { } } -export default (inject) => { +export default (_, inject) => { inject('dompurify', (html: string): string => _unescape(DOMPurify.sanitize(html))); }; From e3bc8e696b9e53717c959b9f58af4fe2fdaf4940 Mon Sep 17 00:00:00 2001 From: Alexander Devitsky Date: Tue, 8 Feb 2022 10:40:19 +0200 Subject: [PATCH 101/486] feat: mobile menu (#569) Co-authored-by: Alexander Devitsky --- .../theme/components/BottomNavigation.vue | 95 ++++++++++--------- .../theme/components/MobileMenuSidebar.vue | 78 +++++++++++++++ packages/theme/lang/de.js | 1 + packages/theme/lang/en.js | 1 + 4 files changed, 130 insertions(+), 45 deletions(-) create mode 100644 packages/theme/components/MobileMenuSidebar.vue diff --git a/packages/theme/components/BottomNavigation.vue b/packages/theme/components/BottomNavigation.vue index 00cdad55c..0ab6bd45c 100644 --- a/packages/theme/components/BottomNavigation.vue +++ b/packages/theme/components/BottomNavigation.vue @@ -1,50 +1,53 @@ + + diff --git a/packages/theme/lang/de.js b/packages/theme/lang/de.js index 9cf46ea8a..1d77244f8 100644 --- a/packages/theme/lang/de.js +++ b/packages/theme/lang/de.js @@ -88,6 +88,7 @@ export default { "Manage shipping addresses": "Alle gewünschten Versandadressen verwalten (Arbeitsplatz, Privatadresse ...) Auf diese Weise müssen Sie die Versandadresse nicht bei jeder Bestellung manuell eingeben.", "Match it with": "Kombiniere es mit", "Men fashion": "Herrenmode", + "Menu": "Menü", "My billing and shipping address are the same": "Meine Rechnungs- und Lieferadresse sind identisch", "My Cart": "Mein Warenkorb", "No account": "Sie haben noch keinen Account?", diff --git a/packages/theme/lang/en.js b/packages/theme/lang/en.js index 9f258bc01..9de6f6d04 100644 --- a/packages/theme/lang/en.js +++ b/packages/theme/lang/en.js @@ -86,6 +86,7 @@ export default { "Manage shipping addresses": "Manage all the shipping addresses you want (work place, home address...) This way you won\"t have to enter the shipping address manually with each order.", "Match it with": "Match it with", "Men fashion": "Men fashion", + "Menu": "Menu", "My billing and shipping address are the same": "My billing and shipping address are the same", "My Cart": "My Cart", "No account": "Don't have an account yet?", From 2b1d8ad1f4ea4a2381aab0bbefe1f589b1829ff6 Mon Sep 17 00:00:00 2001 From: Marcin Kwiatkowski Date: Tue, 8 Feb 2022 10:46:15 +0100 Subject: [PATCH 102/486] chore: fixed some error reported by eslint (#562) * chore: fixed some error reported by eslint * refactor: removed unnecessary type file --- .../api-client/__tests__/setup/handlers.ts | 2 +- packages/api-client/__tests__/setup/server.ts | 2 +- .../api-client/src/api/cmsBlocks/cmsBlocks.ts | 19 +- .../api-client/src/api/cmsPage/cmsPage.ts | 19 +- .../src/api/countries/countriesList.ts | 15 +- .../src/api/country/countryInformation.ts | 21 +- .../api/createEmptyCart/createEmptyCart.ts | 5 +- .../createProductReview.ts | 25 +-- .../api-client/src/api/currency/currency.ts | 3 +- .../deleteCustomerAddress.ts | 7 +- .../generateCustomerToken.ts | 9 +- .../CustomerPaymentMethods.ts | 13 +- .../CustomerShippingMethods.ts | 45 +++-- .../GuestAvailablePaymentMethods.ts | 13 +- .../GuestAvailableShippingMethods.ts | 45 +++-- .../src/api/placeOrder/placeOrder.ts | 11 +- .../productReviewRatingsMetadata.ts | 19 +- .../removeProductsFromWishlist.ts | 3 +- .../requestPasswordResetEmail.ts | 6 +- .../revokeCustomerToken.ts | 9 +- .../setBillingAddressOnCart.ts | 41 ++-- .../setGuestEmailOnCart.ts | 11 +- .../setPaymentMethodOnCart.ts | 23 ++- .../setShippingAddressesOnCart.ts | 75 +++---- .../subscribeEmailToNewsletter.ts | 9 +- .../updateCustomerAddress.ts | 55 ++--- .../src/api/urlResolver/urlResolver.ts | 17 +- packages/api-client/src/types/GraphQL.ts | 189 ++---------------- .../composables/useExternalCheckout/index.ts | 6 +- .../composables/src/getters/reviewGetters.ts | 10 +- .../src/getters/storeConfigGetters.ts | 2 +- .../theme/components/ProductsCarousel.vue | 2 +- packages/theme/components/RelatedProducts.vue | 2 +- packages/theme/components/SearchResults.vue | 2 +- packages/theme/components/UpsellProducts.vue | 2 +- packages/theme/pages/Checkout/Billing.vue | 7 +- packages/theme/pages/Checkout/Payment.vue | 2 +- packages/theme/pages/MyAccount/MyWishlist.vue | 2 +- packages/theme/pages/Page.vue | 2 +- packages/theme/pages/Product.vue | 6 +- 40 files changed, 318 insertions(+), 438 deletions(-) diff --git a/packages/api-client/__tests__/setup/handlers.ts b/packages/api-client/__tests__/setup/handlers.ts index 544bcb7bb..b46b4d5b4 100644 --- a/packages/api-client/__tests__/setup/handlers.ts +++ b/packages/api-client/__tests__/setup/handlers.ts @@ -1,5 +1,5 @@ import { graphql } from 'msw'; -import {STORE_CONFIG_MOCK_RESP} from './../mockData/api/storeConfig' +import { STORE_CONFIG_MOCK_RESP } from '../mockData/api/storeConfig'; const magento = graphql.link('https://magento2-instance.vuestorefront.io/graphql'); diff --git a/packages/api-client/__tests__/setup/server.ts b/packages/api-client/__tests__/setup/server.ts index 55673ce2b..e52fee0a6 100644 --- a/packages/api-client/__tests__/setup/server.ts +++ b/packages/api-client/__tests__/setup/server.ts @@ -1,4 +1,4 @@ import { setupServer } from 'msw/node'; import { handlers } from './handlers'; -export const server = setupServer(...handlers) +export const server = setupServer(...handlers); diff --git a/packages/api-client/src/api/cmsBlocks/cmsBlocks.ts b/packages/api-client/src/api/cmsBlocks/cmsBlocks.ts index da96417da..65e9c2e08 100644 --- a/packages/api-client/src/api/cmsBlocks/cmsBlocks.ts +++ b/packages/api-client/src/api/cmsBlocks/cmsBlocks.ts @@ -1,12 +1,13 @@ import gql from 'graphql-tag'; export default gql` - query cmsBlock($identifiers: [String]) { - cmsBlocks(identifiers: $identifiers) { - items { - content - identifier - title - } - } - }`; + query cmsBlock($identifiers: [String]) { + cmsBlocks(identifiers: $identifiers) { + items { + content + identifier + title + } + } + } +`; diff --git a/packages/api-client/src/api/cmsPage/cmsPage.ts b/packages/api-client/src/api/cmsPage/cmsPage.ts index 440481557..db59d6814 100644 --- a/packages/api-client/src/api/cmsPage/cmsPage.ts +++ b/packages/api-client/src/api/cmsPage/cmsPage.ts @@ -1,13 +1,14 @@ import gql from 'graphql-tag'; export default gql` -query cmsPage($identifier: String) { - cmsPage(identifier:$identifier) { - identifier - content - title, - meta_title - meta_description - content_heading + query cmsPage($identifier: String) { + cmsPage(identifier:$identifier) { + identifier + content + title, + meta_title + meta_description + content_heading + } } -}`; +`; diff --git a/packages/api-client/src/api/countries/countriesList.ts b/packages/api-client/src/api/countries/countriesList.ts index 439d12bb6..3b0ca4af2 100644 --- a/packages/api-client/src/api/countries/countriesList.ts +++ b/packages/api-client/src/api/countries/countriesList.ts @@ -1,11 +1,12 @@ import gql from 'graphql-tag'; export default gql` -query countriesList { - countries { - id - two_letter_abbreviation - full_name_locale - full_name_english + query countriesList { + countries { + id + two_letter_abbreviation + full_name_locale + full_name_english + } } -}`; +`; diff --git a/packages/api-client/src/api/country/countryInformation.ts b/packages/api-client/src/api/country/countryInformation.ts index 73126d214..5bf874cb5 100644 --- a/packages/api-client/src/api/country/countryInformation.ts +++ b/packages/api-client/src/api/country/countryInformation.ts @@ -1,16 +1,17 @@ import gql from 'graphql-tag'; export default gql` -query countryInformation($id: String) { - country(id: $id) { - id - two_letter_abbreviation - full_name_locale - full_name_english - available_regions { + query countryInformation($id: String) { + country(id: $id) { id - code - name + two_letter_abbreviation + full_name_locale + full_name_english + available_regions { + id + code + name + } } } -}`; +`; diff --git a/packages/api-client/src/api/createEmptyCart/createEmptyCart.ts b/packages/api-client/src/api/createEmptyCart/createEmptyCart.ts index 9160f50b9..ea17b835d 100644 --- a/packages/api-client/src/api/createEmptyCart/createEmptyCart.ts +++ b/packages/api-client/src/api/createEmptyCart/createEmptyCart.ts @@ -2,5 +2,6 @@ import gql from 'graphql-tag'; export default gql` mutation createEmptyCart { - createEmptyCart -}`; + createEmptyCart + } +`; diff --git a/packages/api-client/src/api/createProductReview/createProductReview.ts b/packages/api-client/src/api/createProductReview/createProductReview.ts index 478a5ce5d..24ab27269 100644 --- a/packages/api-client/src/api/createProductReview/createProductReview.ts +++ b/packages/api-client/src/api/createProductReview/createProductReview.ts @@ -1,18 +1,19 @@ import gql from 'graphql-tag'; export default gql` -mutation createProductReview($input: CreateProductReviewInput!) { - createProductReview(input: $input){ - review { - average_rating - ratings_breakdown { - name - value + mutation createProductReview($input: CreateProductReviewInput!) { + createProductReview(input: $input){ + review { + average_rating + ratings_breakdown { + name + value + } + nickname + summary + text + created_at } - nickname - summary - text - created_at } } -}`; +`; diff --git a/packages/api-client/src/api/currency/currency.ts b/packages/api-client/src/api/currency/currency.ts index e660ed682..8ba84449c 100644 --- a/packages/api-client/src/api/currency/currency.ts +++ b/packages/api-client/src/api/currency/currency.ts @@ -15,4 +15,5 @@ export default gql` rate } } - }`; + } +`; diff --git a/packages/api-client/src/api/deleteCustomerAddress/deleteCustomerAddress.ts b/packages/api-client/src/api/deleteCustomerAddress/deleteCustomerAddress.ts index aa40834c2..fe8bfc4ca 100644 --- a/packages/api-client/src/api/deleteCustomerAddress/deleteCustomerAddress.ts +++ b/packages/api-client/src/api/deleteCustomerAddress/deleteCustomerAddress.ts @@ -1,6 +1,7 @@ import gql from 'graphql-tag'; export default gql` -mutation deleteCustomerAddress($id: Int!) { - deleteCustomerAddress(id: $id) -}`; + mutation deleteCustomerAddress($id: Int!) { + deleteCustomerAddress(id: $id) + } +`; diff --git a/packages/api-client/src/api/generateCustomerToken/generateCustomerToken.ts b/packages/api-client/src/api/generateCustomerToken/generateCustomerToken.ts index da955b83b..cfffcbc90 100644 --- a/packages/api-client/src/api/generateCustomerToken/generateCustomerToken.ts +++ b/packages/api-client/src/api/generateCustomerToken/generateCustomerToken.ts @@ -1,8 +1,9 @@ import gql from 'graphql-tag'; export default gql` -mutation generateCustomerToken($email: String!, $password: String!) { - generateCustomerToken(email: $email, password: $password) { - token + mutation generateCustomerToken($email: String!, $password: String!) { + generateCustomerToken(email: $email, password: $password) { + token + } } -}`; +`; diff --git a/packages/api-client/src/api/getAvailableCustomerPaymentMethods/CustomerPaymentMethods.ts b/packages/api-client/src/api/getAvailableCustomerPaymentMethods/CustomerPaymentMethods.ts index 458ded56f..3559f6a23 100644 --- a/packages/api-client/src/api/getAvailableCustomerPaymentMethods/CustomerPaymentMethods.ts +++ b/packages/api-client/src/api/getAvailableCustomerPaymentMethods/CustomerPaymentMethods.ts @@ -1,11 +1,12 @@ import gql from 'graphql-tag'; export default gql` -query CustomerAvailablePaymentMethods { - customerCart { - available_payment_methods { - code - title + query CustomerAvailablePaymentMethods { + customerCart { + available_payment_methods { + code + title + } } } -}`; +`; diff --git a/packages/api-client/src/api/getAvailableCustomerShippingMethods/CustomerShippingMethods.ts b/packages/api-client/src/api/getAvailableCustomerShippingMethods/CustomerShippingMethods.ts index d3ca1f2b2..305411ef0 100644 --- a/packages/api-client/src/api/getAvailableCustomerShippingMethods/CustomerShippingMethods.ts +++ b/packages/api-client/src/api/getAvailableCustomerShippingMethods/CustomerShippingMethods.ts @@ -1,29 +1,30 @@ import gql from 'graphql-tag'; export default gql` -query CustomerAvailableShippingMethods { - customerCart { - shipping_addresses { - available_shipping_methods { - amount { - currency - value - } - available - carrier_code - carrier_title - error_message - method_code - method_title - price_excl_tax { - currency - value - } - price_incl_tax { - currency - value + query CustomerAvailableShippingMethods { + customerCart { + shipping_addresses { + available_shipping_methods { + amount { + currency + value + } + available + carrier_code + carrier_title + error_message + method_code + method_title + price_excl_tax { + currency + value + } + price_incl_tax { + currency + value + } } } } } -}`; +`; diff --git a/packages/api-client/src/api/getAvailablePaymentMethods/GuestAvailablePaymentMethods.ts b/packages/api-client/src/api/getAvailablePaymentMethods/GuestAvailablePaymentMethods.ts index 215c465bc..8c6550fbf 100644 --- a/packages/api-client/src/api/getAvailablePaymentMethods/GuestAvailablePaymentMethods.ts +++ b/packages/api-client/src/api/getAvailablePaymentMethods/GuestAvailablePaymentMethods.ts @@ -1,11 +1,12 @@ import gql from 'graphql-tag'; export default gql` -query GuestAvailablePaymentMethods($cartId: String!) { - cart(cart_id: $cartId) { - available_payment_methods { - code - title + query GuestAvailablePaymentMethods($cartId: String!) { + cart(cart_id: $cartId) { + available_payment_methods { + code + title + } } } -}`; +`; diff --git a/packages/api-client/src/api/getAvailableShippingMethods/GuestAvailableShippingMethods.ts b/packages/api-client/src/api/getAvailableShippingMethods/GuestAvailableShippingMethods.ts index 6389bdf18..f8669eaf0 100644 --- a/packages/api-client/src/api/getAvailableShippingMethods/GuestAvailableShippingMethods.ts +++ b/packages/api-client/src/api/getAvailableShippingMethods/GuestAvailableShippingMethods.ts @@ -1,29 +1,30 @@ import gql from 'graphql-tag'; export default gql` -query GuestAvailableShippingMethods($cart_id: String!) { - cart(cart_id:$cart_id) { - shipping_addresses { - available_shipping_methods { - amount { - currency - value - } - available - carrier_code - carrier_title - error_message - method_code - method_title - price_excl_tax { - currency - value - } - price_incl_tax { - currency - value + query GuestAvailableShippingMethods($cart_id: String!) { + cart(cart_id:$cart_id) { + shipping_addresses { + available_shipping_methods { + amount { + currency + value + } + available + carrier_code + carrier_title + error_message + method_code + method_title + price_excl_tax { + currency + value + } + price_incl_tax { + currency + value + } } } } } -}`; +`; diff --git a/packages/api-client/src/api/placeOrder/placeOrder.ts b/packages/api-client/src/api/placeOrder/placeOrder.ts index cad952e3d..eff26145c 100644 --- a/packages/api-client/src/api/placeOrder/placeOrder.ts +++ b/packages/api-client/src/api/placeOrder/placeOrder.ts @@ -1,10 +1,11 @@ import gql from 'graphql-tag'; export default gql` -mutation placeOrder($input: PlaceOrderInput) { - placeOrder(input: $input) { - order { - order_number + mutation placeOrder($input: PlaceOrderInput) { + placeOrder(input: $input) { + order { + order_number + } } } -}`; +`; diff --git a/packages/api-client/src/api/productReviewRatingsMetadata/productReviewRatingsMetadata.ts b/packages/api-client/src/api/productReviewRatingsMetadata/productReviewRatingsMetadata.ts index 38e8fab35..362401999 100644 --- a/packages/api-client/src/api/productReviewRatingsMetadata/productReviewRatingsMetadata.ts +++ b/packages/api-client/src/api/productReviewRatingsMetadata/productReviewRatingsMetadata.ts @@ -1,15 +1,16 @@ import gql from 'graphql-tag'; export default gql` -query productReviewRatingsMetadata{ - productReviewRatingsMetadata { - items { - id - name - values { - value_id - value + query productReviewRatingsMetadata{ + productReviewRatingsMetadata { + items { + id + name + values { + value_id + value + } } } } -}`; +`; diff --git a/packages/api-client/src/api/removeProductsFromWishlist/removeProductsFromWishlist.ts b/packages/api-client/src/api/removeProductsFromWishlist/removeProductsFromWishlist.ts index 80eab4fd2..986bd1391 100644 --- a/packages/api-client/src/api/removeProductsFromWishlist/removeProductsFromWishlist.ts +++ b/packages/api-client/src/api/removeProductsFromWishlist/removeProductsFromWishlist.ts @@ -137,4 +137,5 @@ export default gql` } } } - }`; + } +`; diff --git a/packages/api-client/src/api/requestPasswordResetEmail/requestPasswordResetEmail.ts b/packages/api-client/src/api/requestPasswordResetEmail/requestPasswordResetEmail.ts index 2a6a8e643..a1e454982 100644 --- a/packages/api-client/src/api/requestPasswordResetEmail/requestPasswordResetEmail.ts +++ b/packages/api-client/src/api/requestPasswordResetEmail/requestPasswordResetEmail.ts @@ -1,7 +1,7 @@ import gql from 'graphql-tag'; export default gql` -mutation requestPasswordResetEmail($email: String!){ - requestPasswordResetEmail(email: $email) -} + mutation requestPasswordResetEmail($email: String!){ + requestPasswordResetEmail(email: $email) + } `; diff --git a/packages/api-client/src/api/revokeCustomerToken/revokeCustomerToken.ts b/packages/api-client/src/api/revokeCustomerToken/revokeCustomerToken.ts index 018edd715..9ac2f4fb2 100644 --- a/packages/api-client/src/api/revokeCustomerToken/revokeCustomerToken.ts +++ b/packages/api-client/src/api/revokeCustomerToken/revokeCustomerToken.ts @@ -1,8 +1,9 @@ import gql from 'graphql-tag'; export default gql` -mutation revokeCustomerToken{ - revokeCustomerToken { - result + mutation revokeCustomerToken{ + revokeCustomerToken { + result + } } -}`; +`; diff --git a/packages/api-client/src/api/setBillingAddressOnCart/setBillingAddressOnCart.ts b/packages/api-client/src/api/setBillingAddressOnCart/setBillingAddressOnCart.ts index 30712dceb..5b03a3e14 100644 --- a/packages/api-client/src/api/setBillingAddressOnCart/setBillingAddressOnCart.ts +++ b/packages/api-client/src/api/setBillingAddressOnCart/setBillingAddressOnCart.ts @@ -1,27 +1,28 @@ import gql from 'graphql-tag'; export default gql` -mutation setBillingAddressOnCart($input: SetBillingAddressOnCartInput) { - setBillingAddressOnCart(input: $input) { - cart { - billing_address { - firstname - lastname - company - street - city - region { - code - region_id - label - } - postcode - telephone - country { - code - label + mutation setBillingAddressOnCart($input: SetBillingAddressOnCartInput) { + setBillingAddressOnCart(input: $input) { + cart { + billing_address { + firstname + lastname + company + street + city + region { + code + region_id + label + } + postcode + telephone + country { + code + label + } } } } } -}`; +`; diff --git a/packages/api-client/src/api/setGuestEmailOnCart/setGuestEmailOnCart.ts b/packages/api-client/src/api/setGuestEmailOnCart/setGuestEmailOnCart.ts index 2f7e25e5f..286409522 100644 --- a/packages/api-client/src/api/setGuestEmailOnCart/setGuestEmailOnCart.ts +++ b/packages/api-client/src/api/setGuestEmailOnCart/setGuestEmailOnCart.ts @@ -1,10 +1,11 @@ import gql from 'graphql-tag'; export default gql` -mutation setGuestEmailOnCart($input: SetGuestEmailOnCartInput) { - setGuestEmailOnCart(input: $input) { - cart { - email + mutation setGuestEmailOnCart($input: SetGuestEmailOnCartInput) { + setGuestEmailOnCart(input: $input) { + cart { + email + } } } -}`; +`; diff --git a/packages/api-client/src/api/setPaymentMethodOnCart/setPaymentMethodOnCart.ts b/packages/api-client/src/api/setPaymentMethodOnCart/setPaymentMethodOnCart.ts index 7317c4c71..f0c2571b6 100644 --- a/packages/api-client/src/api/setPaymentMethodOnCart/setPaymentMethodOnCart.ts +++ b/packages/api-client/src/api/setPaymentMethodOnCart/setPaymentMethodOnCart.ts @@ -1,17 +1,18 @@ import gql from 'graphql-tag'; export default gql` -mutation setPaymentMethodOnCart($input: SetPaymentMethodOnCartInput) { - setPaymentMethodOnCart(input: $input) { - cart { - available_payment_methods { - code - title - } - selected_payment_method { - code - title + mutation setPaymentMethodOnCart($input: SetPaymentMethodOnCartInput) { + setPaymentMethodOnCart(input: $input) { + cart { + available_payment_methods { + code + title + } + selected_payment_method { + code + title + } } } } -}`; +`; diff --git a/packages/api-client/src/api/setShippingAddressesOnCart/setShippingAddressesOnCart.ts b/packages/api-client/src/api/setShippingAddressesOnCart/setShippingAddressesOnCart.ts index a440171f8..f8d08b4c3 100644 --- a/packages/api-client/src/api/setShippingAddressesOnCart/setShippingAddressesOnCart.ts +++ b/packages/api-client/src/api/setShippingAddressesOnCart/setShippingAddressesOnCart.ts @@ -1,47 +1,48 @@ import gql from 'graphql-tag'; export default gql` -mutation setShippingAddressesOnCart($input: SetShippingAddressesOnCartInput) { - setShippingAddressesOnCart(input: $input) { - cart { - shipping_addresses { - city - company - firstname - lastname - postcode - region { - code - label - region_id - } - street - telephone - country { - code - label - } - available_shipping_methods { - amount { - currency - value + mutation setShippingAddressesOnCart($input: SetShippingAddressesOnCartInput) { + setShippingAddressesOnCart(input: $input) { + cart { + shipping_addresses { + city + company + firstname + lastname + postcode + region { + code + label + region_id } - available - carrier_code - carrier_title - error_message - method_code - method_title - price_excl_tax { - currency - value + street + telephone + country { + code + label } - price_incl_tax { - currency - value + available_shipping_methods { + amount { + currency + value + } + available + carrier_code + carrier_title + error_message + method_code + method_title + price_excl_tax { + currency + value + } + price_incl_tax { + currency + value + } } } } } } -}`; +`; diff --git a/packages/api-client/src/api/subscribeEmailToNewsletter/subscribeEmailToNewsletter.ts b/packages/api-client/src/api/subscribeEmailToNewsletter/subscribeEmailToNewsletter.ts index 7b851416b..9a0b02c4b 100644 --- a/packages/api-client/src/api/subscribeEmailToNewsletter/subscribeEmailToNewsletter.ts +++ b/packages/api-client/src/api/subscribeEmailToNewsletter/subscribeEmailToNewsletter.ts @@ -1,8 +1,9 @@ import gql from 'graphql-tag'; export default gql` -mutation subscribeEmailToNewsletter($email: String!){ - subscribeEmailToNewsletter(email: $email) { - status + mutation subscribeEmailToNewsletter($email: String!){ + subscribeEmailToNewsletter(email: $email) { + status + } } -}`; +`; diff --git a/packages/api-client/src/api/updateCustomerAddress/updateCustomerAddress.ts b/packages/api-client/src/api/updateCustomerAddress/updateCustomerAddress.ts index 618aa3e53..249fca615 100644 --- a/packages/api-client/src/api/updateCustomerAddress/updateCustomerAddress.ts +++ b/packages/api-client/src/api/updateCustomerAddress/updateCustomerAddress.ts @@ -2,32 +2,33 @@ import gql from 'graphql-tag'; export default gql` mutation updateCustomerAddress($id: Int!, $input: CustomerAddressInput) { - updateCustomerAddress(id: $id, input: $input) { - id - city - company - country_code - default_billing - default_shipping - extension_attributes { - attribute_code - value + updateCustomerAddress(id: $id, input: $input) { + id + city + company + country_code + default_billing + default_shipping + extension_attributes { + attribute_code + value + } + fax + firstname + id + lastname + middlename + postcode + prefix + region { + region + region_code + region_id + } + street + suffix + telephone + vat_id } - fax - firstname - id - lastname - middlename - postcode - prefix - region { - region - region_code - region_id - } - street - suffix - telephone - vat_id } -}`; +`; diff --git a/packages/api-client/src/api/urlResolver/urlResolver.ts b/packages/api-client/src/api/urlResolver/urlResolver.ts index 8b420e57c..1d4c3b2fb 100644 --- a/packages/api-client/src/api/urlResolver/urlResolver.ts +++ b/packages/api-client/src/api/urlResolver/urlResolver.ts @@ -1,12 +1,13 @@ import gql from 'graphql-tag'; export default gql` -query urlResolver($url: String!) { - urlResolver(url:$url) { - id, - redirectCode, - relative_url, - type - entity_uid + query urlResolver($url: String!) { + urlResolver(url:$url) { + id, + redirectCode, + relative_url, + type + entity_uid + } } -}`; +`; diff --git a/packages/api-client/src/types/GraphQL.ts b/packages/api-client/src/types/GraphQL.ts index dc5a1e577..c4b78fc00 100644 --- a/packages/api-client/src/types/GraphQL.ts +++ b/packages/api-client/src/types/GraphQL.ts @@ -599,7 +599,6 @@ export interface BundleProduct extends CustomizableProductInterface, PhysicalPro weight?: Maybe; } - /** Defines basic features of a bundle product and contains multiple BundleItems */ export interface BundleProductReviewsArgs { currentPage?: InputMaybe; @@ -800,7 +799,7 @@ export enum CartUserInputErrorType { InsufficientStock = 'INSUFFICIENT_STOCK', NotSalable = 'NOT_SALABLE', ProductNotFound = 'PRODUCT_NOT_FOUND', - Undefined = 'UNDEFINED' + Undefined = 'UNDEFINED', } export interface Categories { @@ -893,7 +892,6 @@ export interface CategoryInterface { url_suffix?: Maybe; } - /** CategoryInterface contains the full set of attributes that can be returned in a category search. */ export interface CategoryInterfaceProductsArgs { currentPage?: InputMaybe; @@ -992,7 +990,6 @@ export interface CategoryTree extends CategoryInterface, RoutableInterface { url_suffix?: Maybe; } - /** Category tree implementation */ export interface CategoryTreeProductsArgs { currentPage?: InputMaybe; @@ -1028,7 +1025,7 @@ export interface CheckoutAgreement { export enum CheckoutAgreementMode { Auto = 'AUTO', - Manual = 'MANUAL' + Manual = 'MANUAL', } /** An error encountered while adding an item the the cart. */ @@ -1046,7 +1043,7 @@ export enum CheckoutUserInputErrorCodes { NotSalable = 'NOT_SALABLE', ProductNotFound = 'PRODUCT_NOT_FOUND', ReorderNotAvailable = 'REORDER_NOT_AVAILABLE', - Undefined = 'UNDEFINED' + Undefined = 'UNDEFINED', } /** CMS block defines all CMS block information */ @@ -1344,13 +1341,11 @@ export interface ConfigurableProduct extends CustomizableProductInterface, Physi weight?: Maybe; } - /** ConfigurableProduct defines basic features of a configurable product and its simple product variants */ export interface ConfigurableProductConfigurable_Product_Options_SelectionArgs { configurableOptionValueUids?: InputMaybe>; } - /** ConfigurableProduct defines basic features of a configurable product and its simple product variants */ export interface ConfigurableProductReviewsArgs { currentPage?: InputMaybe; @@ -1979,7 +1974,7 @@ export enum CountryCodeEnum { /** Zambia */ Zm = 'ZM', /** Zimbabwe */ - Zw = 'ZW' + Zw = 'ZW', } export interface CreateCompareListInput { @@ -2283,7 +2278,7 @@ export enum CurrencyEnum { Ytl = 'YTL', Zar = 'ZAR', Zmk = 'ZMK', - Zwd = 'ZWD' + Zwd = 'ZWD', } /** CustomAttributeMetadata defines an array of attribute_codes and entity_types */ @@ -2352,7 +2347,6 @@ export interface Customer { wishlists: Array>; } - /** Customer defines the customer name and address and other details */ export interface CustomerOrdersArgs { currentPage?: InputMaybe; @@ -2360,20 +2354,17 @@ export interface CustomerOrdersArgs { pageSize?: InputMaybe; } - /** Customer defines the customer name and address and other details */ export interface CustomerReviewsArgs { currentPage?: InputMaybe; pageSize?: InputMaybe; } - /** Customer defines the customer name and address and other details */ export interface CustomerWishlist_V2Args { id: Scalars['ID']; } - /** Customer defines the customer name and address and other details */ export interface CustomerWishlistsArgs { currentPage?: InputMaybe; @@ -2774,7 +2765,7 @@ export interface CustomizableDateOption extends CustomizableOptionInterface { export enum CustomizableDateTypeEnum { Date = 'DATE', DateTime = 'DATE_TIME', - Time = 'TIME' + Time = 'TIME', } /** CustomizableDateValue defines the price and sku of a product whose page contains a customized date picker. */ @@ -3061,7 +3052,7 @@ export interface DownloadableCreditMemoItem extends CreditMemoItemInterface { export enum DownloadableFileTypeEnum { File = 'FILE', - Url = 'URL' + Url = 'URL', } export interface DownloadableInvoiceItem extends InvoiceItemInterface { @@ -3308,7 +3299,6 @@ export interface DownloadableProduct extends CustomizableProductInterface, Produ websites?: Maybe>>; } - /** DownloadableProduct defines a product that the shopper downloads */ export interface DownloadableProductReviewsArgs { currentPage?: InputMaybe; @@ -3503,7 +3493,7 @@ export enum FixedProductTaxDisplaySettings { /** The displayed price includes the FPT amount without displaying the ProductPrice.fixed_product_taxes values. This value corresponds to 'Including FPT only' */ IncludeFptWithoutDetails = 'INCLUDE_FPT_WITHOUT_DETAILS', /** The displayed price includes the FPT amount while displaying the values of ProductPrice.fixed_product_taxes separately. This value corresponds to 'Including FPT and FPT description' */ - IncludeFptWithDetails = 'INCLUDE_FPT_WITH_DETAILS' + IncludeFptWithDetails = 'INCLUDE_FPT_WITH_DETAILS', } export interface GenerateCustomerTokenAsAdminInput { @@ -3708,7 +3698,6 @@ export interface GroupedProduct extends PhysicalProductInterface, ProductInterfa weight?: Maybe; } - /** A grouped product consists of simple standalone products that are presented as a group */ export interface GroupedProductReviewsArgs { currentPage?: InputMaybe; @@ -4103,241 +4092,195 @@ export interface Mutation { updateQuoteEmail?: Maybe; } - export interface MutationAddBundleProductsToCartArgs { input?: InputMaybe; } - export interface MutationAddConfigurableProductsToCartArgs { input?: InputMaybe; } - export interface MutationAddDownloadableProductsToCartArgs { input?: InputMaybe; } - export interface MutationAddProductsToCartArgs { cartId: Scalars['String']; cartItems: Array; } - export interface MutationAddProductsToCompareListArgs { input?: InputMaybe; } - export interface MutationAddProductsToWishlistArgs { wishlistId: Scalars['ID']; wishlistItems: Array; } - export interface MutationAddSimpleProductsToCartArgs { input?: InputMaybe; } - export interface MutationAddVirtualProductsToCartArgs { input?: InputMaybe; } - export interface MutationAddWishlistItemsToCartArgs { wishlistId: Scalars['ID']; wishlistItemIds?: InputMaybe>; } - export interface MutationApplyCouponToCartArgs { input?: InputMaybe; } - export interface MutationAssignCompareListToCustomerArgs { uid: Scalars['ID']; } - export interface MutationChangeCustomerPasswordArgs { currentPassword: Scalars['String']; newPassword: Scalars['String']; } - export interface MutationCreateCompareListArgs { input?: InputMaybe; } - export interface MutationCreateCustomerArgs { input: CustomerInput; } - export interface MutationCreateCustomerAddressArgs { input: CustomerAddressInput; } - export interface MutationCreateCustomerV2Args { input: CustomerCreateInput; } - export interface MutationCreateEmptyCartArgs { input?: InputMaybe; } - export interface MutationCreateKlarnaPaymentsSessionArgs { input?: InputMaybe; } - export interface MutationCreatePayflowProTokenArgs { input: PayflowProTokenInput; } - export interface MutationCreatePaypalExpressTokenArgs { input: PaypalExpressTokenInput; } - export interface MutationCreateProductReviewArgs { input: CreateProductReviewInput; } - export interface MutationDeleteCompareListArgs { uid: Scalars['ID']; } - export interface MutationDeleteCustomerAddressArgs { id: Scalars['Int']; } - export interface MutationDeletePaymentTokenArgs { public_hash: Scalars['String']; } - export interface MutationGenerateCustomerTokenArgs { email: Scalars['String']; password: Scalars['String']; } - export interface MutationGenerateCustomerTokenAsAdminArgs { input: GenerateCustomerTokenAsAdminInput; } - export interface MutationHandlePayflowProResponseArgs { input: PayflowProResponseInput; } - export interface MutationMergeCartsArgs { destination_cart_id?: InputMaybe; source_cart_id: Scalars['String']; } - export interface MutationPlaceOrderArgs { input?: InputMaybe; } - export interface MutationRemoveCouponFromCartArgs { input?: InputMaybe; } - export interface MutationRemoveItemFromCartArgs { input?: InputMaybe; } - export interface MutationRemoveProductsFromCompareListArgs { input?: InputMaybe; } - export interface MutationRemoveProductsFromWishlistArgs { wishlistId: Scalars['ID']; wishlistItemsIds: Array; } - export interface MutationReorderItemsArgs { orderNumber: Scalars['String']; } - export interface MutationRequestPasswordResetEmailArgs { email: Scalars['String']; } - export interface MutationResetPasswordArgs { email: Scalars['String']; newPassword: Scalars['String']; resetPasswordToken: Scalars['String']; } - export interface MutationSendEmailToFriendArgs { input?: InputMaybe; } - export interface MutationSetBillingAddressOnCartArgs { input?: InputMaybe; } - export interface MutationSetGuestEmailOnCartArgs { input?: InputMaybe; } - export interface MutationSetPaymentMethodAndPlaceOrderArgs { input?: InputMaybe; } - export interface MutationSetPaymentMethodOnCartArgs { input?: InputMaybe; } - export interface MutationSetShippingAddressesOnCartArgs { input?: InputMaybe; } - export interface MutationSetShippingMethodsOnCartArgs { input?: InputMaybe; } - export interface MutationSubscribeEmailToNewsletterArgs { email: Scalars['String']; } - export interface MutationUpdateCartItemsArgs { input?: InputMaybe; } - export interface MutationUpdateChatProfileArgs { email?: InputMaybe; firstname?: InputMaybe; @@ -4345,35 +4288,29 @@ export interface MutationUpdateChatProfileArgs { profileId: Scalars['String']; } - export interface MutationUpdateCustomerArgs { input: CustomerInput; } - export interface MutationUpdateCustomerAddressArgs { id: Scalars['Int']; input?: InputMaybe; } - export interface MutationUpdateCustomerEmailArgs { email: Scalars['String']; password: Scalars['String']; } - export interface MutationUpdateCustomerV2Args { input: CustomerUpdateInput; } - export interface MutationUpdateProductsInWishlistArgs { wishlistId: Scalars['ID']; wishlistItems: Array; } - export interface MutationUpdateQuoteEmailArgs { cartId: Scalars['String']; email: Scalars['String']; @@ -4569,7 +4506,7 @@ export interface PayflowLinkInput { /** Mode for payment: TEST or LIVE. Applies to Payflow Link and Payments Advanced payment methods. */ export enum PayflowLinkMode { Live = 'LIVE', - Test = 'TEST' + Test = 'TEST', } /** Contains information used to generate PayPal iframe for transaction. Applies to Payflow Link and Payments Advanced payment methods. */ @@ -4671,7 +4608,7 @@ export interface PaymentToken { /** The list of available payment token types */ export enum PaymentTokenTypeEnum { Account = 'account', - Card = 'card' + Card = 'card', } /** Required input for Express Checkout and Payments Standard payments */ @@ -4871,13 +4808,13 @@ export interface PriceAdjustment { export enum PriceAdjustmentCodesEnum { Tax = 'TAX', Weee = 'WEEE', - WeeeTax = 'WEEE_TAX' + WeeeTax = 'WEEE_TAX', } /** PriceAdjustmentDescriptionEnum is deprecated. This enumeration states whether a price adjustment is included or excluded. */ export enum PriceAdjustmentDescriptionEnum { Excluded = 'EXCLUDED', - Included = 'INCLUDED' + Included = 'INCLUDED', } /** Price range for a product. If the product has a single price, the minimum and maximum price will be the same. */ @@ -4892,13 +4829,13 @@ export interface PriceRange { export enum PriceTypeEnum { Dynamic = 'DYNAMIC', Fixed = 'FIXED', - Percent = 'PERCENT' + Percent = 'PERCENT', } /** This enumeration defines whether a bundle product's price is displayed as the lowest possible value or as a range. */ export enum PriceViewEnum { AsLowAs = 'AS_LOW_AS', - PriceRange = 'PRICE_RANGE' + PriceRange = 'PRICE_RANGE', } export interface ProductAttribute { @@ -5249,7 +5186,6 @@ export interface ProductInterface { websites?: Maybe>>; } - /** The ProductInterface contains attributes that are common to all types of products. Note that descriptions may not be available for custom and EAV attributes. */ export interface ProductInterfaceReviewsArgs { currentPage?: InputMaybe; @@ -5475,7 +5411,7 @@ export interface ProductSortInput { /** This enumeration states whether a product stock status is in stock or out of stock */ export enum ProductStockStatus { InStock = 'IN_STOCK', - OutOfStock = 'OUT_OF_STOCK' + OutOfStock = 'OUT_OF_STOCK', } /** ProductTierPrices is deprecated and has been replaced by TierPrice. The ProductTierPrices object defines a tier price, which is a quantity discount offered to a specific customer group. */ @@ -5616,80 +5552,65 @@ export interface Query { wishlist?: Maybe; } - export interface QueryAvailableStoresArgs { useCurrentGroup?: InputMaybe; } - export interface QueryCartArgs { cart_id: Scalars['String']; } - export interface QueryCategoriesArgs { currentPage?: InputMaybe; filters?: InputMaybe; pageSize?: InputMaybe; } - export interface QueryCategoryArgs { id?: InputMaybe; } - export interface QueryCategoryListArgs { filters?: InputMaybe; } - export interface QueryCmsBlocksArgs { identifiers?: InputMaybe>>; } - export interface QueryCmsPageArgs { id?: InputMaybe; identifier?: InputMaybe; } - export interface QueryCompareListArgs { uid: Scalars['ID']; } - export interface QueryCountryArgs { id?: InputMaybe; } - export interface QueryCustomAttributeMetadataArgs { attributes: Array; } - export interface QueryGetHostedProUrlArgs { input: HostedProUrlInput; } - export interface QueryGetPayflowLinkTokenArgs { input: PayflowLinkTokenInput; } - export interface QueryIsEmailAvailableArgs { email: Scalars['String']; } - export interface QueryOrderDataArgs { orderId: Scalars['String']; } - export interface QueryPickupLocationsArgs { area?: InputMaybe; currentPage?: InputMaybe; @@ -5699,7 +5620,6 @@ export interface QueryPickupLocationsArgs { sort?: InputMaybe; } - export interface QueryProductsArgs { currentPage?: InputMaybe; filter?: InputMaybe; @@ -5708,12 +5628,10 @@ export interface QueryProductsArgs { sort?: InputMaybe; } - export interface QueryRouteArgs { url: Scalars['String']; } - export interface QueryUrlResolverArgs { url: Scalars['String']; } @@ -5971,7 +5889,7 @@ export interface SetShippingMethodsOnCartOutput { /** This enumeration defines whether bundle items must be shipped together. */ export enum ShipBundleItemsEnum { Separately = 'SEPARATELY', - Together = 'TOGETHER' + Together = 'TOGETHER', } export interface ShipmentItem extends ShipmentItemInterface { @@ -6255,7 +6173,6 @@ export interface SimpleProduct extends CustomizableProductInterface, PhysicalPro weight?: Maybe; } - /** A simple product is tangible and is usually sold in single units or in fixed quantities */ export interface SimpleProductReviewsArgs { currentPage?: InputMaybe; @@ -6286,7 +6203,7 @@ export interface SimpleWishlistItem extends WishlistItemInterface { /** This enumeration indicates whether to return results in ascending or descending order */ export enum SortEnum { Asc = 'ASC', - Desc = 'DESC' + Desc = 'DESC', } export interface SortField { @@ -6488,7 +6405,7 @@ export enum SubscriptionStatusesEnum { NotActive = 'NOT_ACTIVE', Subscribed = 'SUBSCRIBED', Unconfirmed = 'UNCONFIRMED', - Unsubscribed = 'UNSUBSCRIBED' + Unsubscribed = 'UNSUBSCRIBED', } export interface SwatchData { @@ -6592,13 +6509,13 @@ export interface UrlRewrite { export enum UrlRewriteEntityTypeEnum { Category = 'CATEGORY', CmsPage = 'CMS_PAGE', - Product = 'PRODUCT' + Product = 'PRODUCT', } export enum UseInLayeredNavigationOptions { FilterableNoResult = 'FILTERABLE_NO_RESULT', FilterableWithResults = 'FILTERABLE_WITH_RESULTS', - No = 'NO' + No = 'NO', } /** Required input for payment methods with Vault support. */ @@ -6789,7 +6706,6 @@ export interface VirtualProduct extends CustomizableProductInterface, ProductInt websites?: Maybe>>; } - /** A virtual product is a non-tangible product that does not require shipping and is not kept in inventory */ export interface VirtualProductReviewsArgs { currentPage?: InputMaybe; @@ -6861,7 +6777,7 @@ export interface WishListUserInputError { export enum WishListUserInputErrorType { ProductNotFound = 'PRODUCT_NOT_FOUND', - Undefined = 'UNDEFINED' + Undefined = 'UNDEFINED', } export interface Wishlist { @@ -6879,7 +6795,6 @@ export interface Wishlist { updated_at?: Maybe; } - export interface WishlistItems_V2Args { currentPage?: InputMaybe; pageSize?: InputMaybe; @@ -6900,7 +6815,7 @@ export enum WishlistCartUserInputErrorType { InsufficientStock = 'INSUFFICIENT_STOCK', NotSalable = 'NOT_SALABLE', ProductNotFound = 'PRODUCT_NOT_FOUND', - Undefined = 'UNDEFINED' + Undefined = 'UNDEFINED', } export interface WishlistItem { @@ -7013,21 +6928,18 @@ export type AddBundleProductsToCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type AddBundleProductsToCartMutation = { addBundleProductsToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type AddConfigurableProductsToCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type AddConfigurableProductsToCartMutation = { addConfigurableProductsToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type AddDownloadableProductsToCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type AddDownloadableProductsToCartMutation = { addDownloadableProductsToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type AddProductsToWishlistMutationVariables = Exact<{ @@ -7035,7 +6947,6 @@ export type AddProductsToWishlistMutationVariables = Exact<{ items: Array | WishlistItemInput; }>; - export type AddProductsToWishlistMutation = { addProductsToWishlist?: { wishlist: { id?: string | null | undefined, items_count?: number | null | undefined, sharing_code?: string | null | undefined, items_v2?: { items: Array<{ id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | null | undefined>, page_info?: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } | null | undefined } | null | undefined } } | null | undefined }; export type AddProductsToCartMutationVariables = Exact<{ @@ -7043,52 +6954,44 @@ export type AddProductsToCartMutationVariables = Exact<{ cartItems: Array | CartItemInput; }>; - export type AddProductsToCartMutation = { addProductsToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type AddSimpleProductsToCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type AddSimpleProductsToCartMutation = { addSimpleProductsToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type AddVirtualProductsToCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type AddVirtualProductsToCartMutation = { addVirtualProductsToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type ApplyCouponToCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type ApplyCouponToCartMutation = { applyCouponToCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type AvailableStoresQueryVariables = Exact<{ [key: string]: never; }>; - export type AvailableStoresQuery = { availableStores?: Array<{ absolute_footer?: string | null | undefined, allow_guests_to_write_product_reviews?: string | null | undefined, allow_items?: string | null | undefined, allow_order?: string | null | undefined, autocomplete_on_storefront?: boolean | null | undefined, base_currency_code?: string | null | undefined, base_link_url?: string | null | undefined, base_media_url?: string | null | undefined, base_static_url?: string | null | undefined, base_url?: string | null | undefined, catalog_default_sort_by?: string | null | undefined, category_fixed_product_tax_display_setting?: FixedProductTaxDisplaySettings | null | undefined, category_url_suffix?: string | null | undefined, cms_home_page?: string | null | undefined, cms_no_cookies?: string | null | undefined, cms_no_route?: string | null | undefined, code?: string | null | undefined, configurable_thumbnail_source?: string | null | undefined, copyright?: string | null | undefined, default_description?: string | null | undefined, default_display_currency_code?: string | null | undefined, default_keywords?: string | null | undefined, default_title?: string | null | undefined, front?: string | null | undefined, grid_per_page?: number | null | undefined, grid_per_page_values?: string | null | undefined, head_includes?: string | null | undefined, head_shortcut_icon?: string | null | undefined, header_logo_src?: string | null | undefined, id?: number | null | undefined, is_default_store?: boolean | null | undefined, is_default_store_group?: boolean | null | undefined, list_mode?: string | null | undefined, list_per_page?: number | null | undefined, list_per_page_values?: string | null | undefined, locale?: string | null | undefined, logo_alt?: string | null | undefined, logo_height?: number | null | undefined, logo_width?: number | null | undefined, magento_wishlist_general_is_enabled?: string | null | undefined, minimum_password_length?: string | null | undefined, no_route?: string | null | undefined, payment_payflowpro_cc_vault_active?: string | null | undefined, product_fixed_product_tax_display_setting?: FixedProductTaxDisplaySettings | null | undefined, product_reviews_enabled?: string | null | undefined, product_url_suffix?: string | null | undefined, required_character_classes_number?: string | null | undefined, root_category_id?: number | null | undefined, root_category_uid?: string | null | undefined, sales_fixed_product_tax_display_setting?: FixedProductTaxDisplaySettings | null | undefined, secure_base_link_url?: string | null | undefined, secure_base_media_url?: string | null | undefined, secure_base_static_url?: string | null | undefined, secure_base_url?: string | null | undefined, show_cms_breadcrumbs?: number | null | undefined, store_code?: string | null | undefined, store_group_code?: string | null | undefined, store_group_name?: string | null | undefined, store_name?: string | null | undefined, store_sort_order?: number | null | undefined, timezone?: string | null | undefined, title_prefix?: string | null | undefined, title_separator?: string | null | undefined, title_suffix?: string | null | undefined, use_store_in_url?: boolean | null | undefined, website_code?: string | null | undefined, website_id?: number | null | undefined, website_name?: string | null | undefined, weight_unit?: string | null | undefined, welcome?: string | null | undefined } | null | undefined> | null | undefined }; export type CartQueryVariables = Exact<{ cartId: Scalars['String']; }>; - export type CartQuery = { cart?: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } | null | undefined }; export type CategoryListQueryVariables = Exact<{ [key: string]: never; }>; - export type CategoryListQuery = { categories?: { items?: Array<{ product_count?: number | null | undefined, name?: string | null | undefined, uid: string, children?: Array<{ include_in_menu?: number | null | undefined, is_anchor?: number | null | undefined, level?: number | null | undefined, name?: string | null | undefined, position?: number | null | undefined, product_count?: number | null | undefined, uid: string, url_path?: string | null | undefined, url_suffix?: string | null | undefined, children?: Array<{ include_in_menu?: number | null | undefined, is_anchor?: number | null | undefined, level?: number | null | undefined, name?: string | null | undefined, position?: number | null | undefined, product_count?: number | null | undefined, uid: string, url_path?: string | null | undefined, url_suffix?: string | null | undefined, children?: Array<{ include_in_menu?: number | null | undefined, is_anchor?: number | null | undefined, level?: number | null | undefined, name?: string | null | undefined, position?: number | null | undefined, product_count?: number | null | undefined, uid: string, url_path?: string | null | undefined, url_suffix?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type CategorySearchQueryVariables = Exact<{ filters?: InputMaybe; }>; - export type CategorySearchQuery = { categoryList?: Array<{ include_in_menu?: number | null | undefined, is_anchor?: number | null | undefined, level?: number | null | undefined, name?: string | null | undefined, position?: number | null | undefined, product_count?: number | null | undefined, uid: string, url_path?: string | null | undefined, url_suffix?: string | null | undefined } | null | undefined> | null | undefined }; export type ChangeCustomerPasswordMutationVariables = Exact<{ @@ -7096,74 +6999,62 @@ export type ChangeCustomerPasswordMutationVariables = Exact<{ newPassword: Scalars['String']; }>; - export type ChangeCustomerPasswordMutation = { changeCustomerPassword?: { date_of_birth?: string | null | undefined, default_billing?: string | null | undefined, default_shipping?: string | null | undefined, email?: string | null | undefined, firstname?: string | null | undefined, is_subscribed?: boolean | null | undefined, lastname?: string | null | undefined, middlename?: string | null | undefined, prefix?: string | null | undefined, suffix?: string | null | undefined, taxvat?: string | null | undefined, addresses?: Array<{ city?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, firstname?: string | null | undefined, id?: number | null | undefined, lastname?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region_code?: string | null | undefined, region_id?: number | null | undefined, region?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type CmsBlockQueryVariables = Exact<{ identifiers?: InputMaybe> | InputMaybe>; }>; - export type CmsBlockQuery = { cmsBlocks?: { items?: Array<{ content?: string | null | undefined, identifier?: string | null | undefined, title?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type CmsPageQueryVariables = Exact<{ identifier?: InputMaybe; }>; - export type CmsPageQuery = { cmsPage?: { identifier?: string | null | undefined, content?: string | null | undefined, title?: string | null | undefined, meta_title?: string | null | undefined, meta_description?: string | null | undefined, content_heading?: string | null | undefined } | null | undefined }; export type CountriesListQueryVariables = Exact<{ [key: string]: never; }>; - export type CountriesListQuery = { countries?: Array<{ id?: string | null | undefined, two_letter_abbreviation?: string | null | undefined, full_name_locale?: string | null | undefined, full_name_english?: string | null | undefined } | null | undefined> | null | undefined }; export type CountryInformationQueryVariables = Exact<{ id?: InputMaybe; }>; - export type CountryInformationQuery = { country?: { id?: string | null | undefined, two_letter_abbreviation?: string | null | undefined, full_name_locale?: string | null | undefined, full_name_english?: string | null | undefined, available_regions?: Array<{ id?: number | null | undefined, code?: string | null | undefined, name?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type CreateCustomerMutationVariables = Exact<{ input: CustomerCreateInput; }>; - export type CreateCustomerMutation = { createCustomerV2?: { customer: { date_of_birth?: string | null | undefined, default_billing?: string | null | undefined, default_shipping?: string | null | undefined, email?: string | null | undefined, firstname?: string | null | undefined, is_subscribed?: boolean | null | undefined, lastname?: string | null | undefined, middlename?: string | null | undefined, prefix?: string | null | undefined, suffix?: string | null | undefined, taxvat?: string | null | undefined, addresses?: Array<{ city?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, firstname?: string | null | undefined, id?: number | null | undefined, lastname?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region_code?: string | null | undefined, region_id?: number | null | undefined, region?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } } | null | undefined }; export type CreateCustomerAddressMutationVariables = Exact<{ input: CustomerAddressInput; }>; - export type CreateCustomerAddressMutation = { createCustomerAddress?: { id?: number | null | undefined, country_code?: CountryCodeEnum | null | undefined, street?: Array | null | undefined, telephone?: string | null | undefined, postcode?: string | null | undefined, city?: string | null | undefined, default_shipping?: boolean | null | undefined, default_billing?: boolean | null | undefined, vat_id?: string | null | undefined, region?: { region?: string | null | undefined, region_id?: number | null | undefined, region_code?: string | null | undefined } | null | undefined } | null | undefined }; export type CreateEmptyCartMutationVariables = Exact<{ [key: string]: never; }>; - export type CreateEmptyCartMutation = { createEmptyCart?: string | null | undefined }; export type CreateProductReviewMutationVariables = Exact<{ input: CreateProductReviewInput; }>; - export type CreateProductReviewMutation = { createProductReview: { review: { average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } } }; export type CurrencyQueryVariables = Exact<{ [key: string]: never; }>; - export type CurrencyQuery = { currency?: { available_currency_codes?: Array | null | undefined, base_currency_code?: string | null | undefined, base_currency_symbol?: string | null | undefined, default_display_currecy_code?: string | null | undefined, default_display_currecy_symbol?: string | null | undefined, default_display_currency_code?: string | null | undefined, default_display_currency_symbol?: string | null | undefined, exchange_rates?: Array<{ currency_to?: string | null | undefined, rate?: number | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type CustomerQueryVariables = Exact<{ [key: string]: never; }>; - export type CustomerQuery = { customer?: { date_of_birth?: string | null | undefined, default_billing?: string | null | undefined, default_shipping?: string | null | undefined, email?: string | null | undefined, firstname?: string | null | undefined, is_subscribed?: boolean | null | undefined, lastname?: string | null | undefined, middlename?: string | null | undefined, prefix?: string | null | undefined, suffix?: string | null | undefined, taxvat?: string | null | undefined, addresses?: Array<{ city?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, firstname?: string | null | undefined, id?: number | null | undefined, lastname?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region_code?: string | null | undefined, region_id?: number | null | undefined, region?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type CustomerCartQueryVariables = Exact<{ [key: string]: never; }>; - export type CustomerCartQuery = { customerCart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } }; export type CustomerOrdersQueryVariables = Exact<{ @@ -7172,7 +7063,6 @@ export type CustomerOrdersQueryVariables = Exact<{ pageSize?: InputMaybe; }>; - export type CustomerOrdersQuery = { customer?: { orders?: { total_count?: number | null | undefined, items: Array<{ order_number: string, id: string, created_at?: string | null | undefined, grand_total?: number | null | undefined, status: string, shipping_method?: string | null | undefined, total?: { discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, base_grand_total: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, shipping_handling?: { amount_excluding_tax?: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } | null | undefined, amount_including_tax?: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } | null | undefined, discounts?: Array<{ amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, taxes?: Array<{ rate: number, title: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, total_amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, subtotal: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, taxes?: Array<{ rate: number, title: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, total_shipping: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, total_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, comments?: Array<{ message: string, timestamp: string } | null | undefined> | null | undefined, invoices: Array<{ id: string, number: string, comments?: Array<{ message: string, timestamp: string } | null | undefined> | null | undefined, items?: Array<{ id: string, product_name?: string | null | undefined, product_sku: string, quantity_invoiced?: number | null | undefined, discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | { id: string, product_name?: string | null | undefined, product_sku: string, quantity_invoiced?: number | null | undefined, discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | { id: string, product_name?: string | null | undefined, product_sku: string, quantity_invoiced?: number | null | undefined, discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, total?: { discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, base_grand_total: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, shipping_handling?: { amount_excluding_tax?: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } | null | undefined, amount_including_tax?: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } | null | undefined, discounts?: Array<{ amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, taxes?: Array<{ rate: number, title: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, total_amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, subtotal: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, taxes?: Array<{ rate: number, title: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, total_shipping: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, total_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined } | null | undefined>, items?: Array<{ id: string, product_name?: string | null | undefined, product_sku: string, product_type?: string | null | undefined, product_url_key?: string | null | undefined, quantity_canceled?: number | null | undefined, quantity_invoiced?: number | null | undefined, quantity_ordered?: number | null | undefined, quantity_refunded?: number | null | undefined, quantity_returned?: number | null | undefined, quantity_shipped?: number | null | undefined, status?: string | null | undefined, discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, entered_options?: Array<{ label: string, value: string } | null | undefined> | null | undefined, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, selected_options?: Array<{ label: string, value: string } | null | undefined> | null | undefined } | { id: string, product_name?: string | null | undefined, product_sku: string, product_type?: string | null | undefined, product_url_key?: string | null | undefined, quantity_canceled?: number | null | undefined, quantity_invoiced?: number | null | undefined, quantity_ordered?: number | null | undefined, quantity_refunded?: number | null | undefined, quantity_returned?: number | null | undefined, quantity_shipped?: number | null | undefined, status?: string | null | undefined, discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, entered_options?: Array<{ label: string, value: string } | null | undefined> | null | undefined, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, selected_options?: Array<{ label: string, value: string } | null | undefined> | null | undefined } | { id: string, product_name?: string | null | undefined, product_sku: string, product_type?: string | null | undefined, product_url_key?: string | null | undefined, quantity_canceled?: number | null | undefined, quantity_invoiced?: number | null | undefined, quantity_ordered?: number | null | undefined, quantity_refunded?: number | null | undefined, quantity_returned?: number | null | undefined, quantity_shipped?: number | null | undefined, status?: string | null | undefined, discounts?: Array<{ label: string, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined, entered_options?: Array<{ label: string, value: string } | null | undefined> | null | undefined, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, selected_options?: Array<{ label: string, value: string } | null | undefined> | null | undefined } | null | undefined> | null | undefined, payment_methods?: Array<{ name: string, type: string, additional_data?: Array<{ name?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, shipments?: Array<{ id: string, number: string, comments?: Array<{ message: string, timestamp: string } | null | undefined> | null | undefined, tracking?: Array<{ carrier: string, number?: string | null | undefined, title: string } | null | undefined> | null | undefined, items?: Array<{ id: string, product_name?: string | null | undefined, product_sku: string, quantity_shipped: number, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | { id: string, product_name?: string | null | undefined, product_sku: string, quantity_shipped: number, product_sale_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined } | null | undefined> | null | undefined, shipping_address?: { city: string, country_code?: CountryCodeEnum | null | undefined, firstname: string, lastname: string, postcode?: string | null | undefined, prefix?: string | null | undefined, region?: string | null | undefined, street: Array, suffix?: string | null | undefined, telephone: string } | null | undefined } | null | undefined>, page_info?: { current_page?: number | null | undefined, total_pages?: number | null | undefined, page_size?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined }; export type CustomerProductReviewQueryVariables = Exact<{ @@ -7180,14 +7070,12 @@ export type CustomerProductReviewQueryVariables = Exact<{ currentPage?: InputMaybe; }>; - export type CustomerProductReviewQuery = { customer?: { reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | null | undefined }; export type DeleteCustomerAddressMutationVariables = Exact<{ id: Scalars['Int']; }>; - export type DeleteCustomerAddressMutation = { deleteCustomerAddress?: boolean | null | undefined }; export type GenerateCustomerTokenMutationVariables = Exact<{ @@ -7195,36 +7083,30 @@ export type GenerateCustomerTokenMutationVariables = Exact<{ password: Scalars['String']; }>; - export type GenerateCustomerTokenMutation = { generateCustomerToken?: { token?: string | null | undefined } | null | undefined }; export type CustomerAvailablePaymentMethodsQueryVariables = Exact<{ [key: string]: never; }>; - export type CustomerAvailablePaymentMethodsQuery = { customerCart: { available_payment_methods?: Array<{ code: string, title: string } | null | undefined> | null | undefined } }; export type CustomerAvailableShippingMethodsQueryVariables = Exact<{ [key: string]: never; }>; - export type CustomerAvailableShippingMethodsQuery = { customerCart: { shipping_addresses: Array<{ available_shipping_methods?: Array<{ available: boolean, carrier_code: string, carrier_title: string, error_message?: string | null | undefined, method_code?: string | null | undefined, method_title?: string | null | undefined, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, price_excl_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, price_incl_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined } | null | undefined> } }; export type GuestAvailablePaymentMethodsQueryVariables = Exact<{ cartId: Scalars['String']; }>; - export type GuestAvailablePaymentMethodsQuery = { cart?: { available_payment_methods?: Array<{ code: string, title: string } | null | undefined> | null | undefined } | null | undefined }; export type GuestAvailableShippingMethodsQueryVariables = Exact<{ cart_id: Scalars['String']; }>; - export type GuestAvailableShippingMethodsQuery = { cart?: { shipping_addresses: Array<{ available_shipping_methods?: Array<{ available: boolean, carrier_code: string, carrier_title: string, error_message?: string | null | undefined, method_code?: string | null | undefined, method_title?: string | null | undefined, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, price_excl_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, price_incl_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined } | null | undefined> } | null | undefined }; export type GetCustomerAddressesQueryVariables = Exact<{ [key: string]: never; }>; - export type GetCustomerAddressesQuery = { customer?: { addresses?: Array<{ city?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, firstname?: string | null | undefined, id?: number | null | undefined, lastname?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region_code?: string | null | undefined, region_id?: number | null | undefined, region?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type MergeCartsMutationVariables = Exact<{ @@ -7232,14 +7114,12 @@ export type MergeCartsMutationVariables = Exact<{ destinationCartId: Scalars['String']; }>; - export type MergeCartsMutation = { mergeCarts: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } }; export type PlaceOrderMutationVariables = Exact<{ input?: InputMaybe; }>; - export type PlaceOrderMutation = { placeOrder?: { order: { order_number: string } } | null | undefined }; export type ProductDetailsQueryVariables = Exact<{ @@ -7251,7 +7131,6 @@ export type ProductDetailsQueryVariables = Exact<{ configurations?: InputMaybe | Scalars['ID']>; }>; - export type ProductDetailsQuery = { products?: { items?: Array<{ uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, url_key?: string | null | undefined, rating_summary: number, review_count: number, meta_description?: string | null | undefined, meta_keyword?: string | null | undefined, meta_title?: string | null | undefined, options_container?: string | null | undefined, special_to_date?: string | null | undefined, items?: Array<{ position?: number | null | undefined, required?: boolean | null | undefined, sku?: string | null | undefined, title?: string | null | undefined, type?: string | null | undefined, uid?: string | null | undefined, options?: Array<{ can_change_quantity?: boolean | null | undefined, is_default?: boolean | null | undefined, position?: number | null | undefined, uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> }, small_image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, media_gallery?: Array<{ url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined> | null | undefined, description?: { html: string } | null | undefined, short_description?: { html: string } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, url_key?: string | null | undefined, rating_summary: number, review_count: number, meta_description?: string | null | undefined, meta_keyword?: string | null | undefined, meta_title?: string | null | undefined, options_container?: string | null | undefined, special_to_date?: string | null | undefined, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, configurable_product_options_selection?: { options_available_for_selection?: Array<{ attribute_code: string, option_value_uids: Array } | null | undefined> | null | undefined, media_gallery?: Array<{ disabled?: boolean | null | undefined, label?: string | null | undefined, position?: number | null | undefined, url?: string | null | undefined } | { disabled?: boolean | null | undefined, label?: string | null | undefined, position?: number | null | undefined, url?: string | null | undefined } | null | undefined> | null | undefined, variant?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> }, small_image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, media_gallery?: Array<{ url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined> | null | undefined, description?: { html: string } | null | undefined, short_description?: { html: string } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, url_key?: string | null | undefined, rating_summary: number, review_count: number, meta_description?: string | null | undefined, meta_keyword?: string | null | undefined, meta_title?: string | null | undefined, options_container?: string | null | undefined, special_to_date?: string | null | undefined, downloadable_product_samples?: Array<{ sample_url?: string | null | undefined, title?: string | null | undefined } | null | undefined> | null | undefined, downloadable_product_links?: Array<{ id?: number | null | undefined, price?: number | null | undefined, title?: string | null | undefined, uid: string } | null | undefined> | null | undefined, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> }, small_image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, media_gallery?: Array<{ url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined> | null | undefined, description?: { html: string } | null | undefined, short_description?: { html: string } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, url_key?: string | null | undefined, rating_summary: number, review_count: number, meta_description?: string | null | undefined, meta_keyword?: string | null | undefined, meta_title?: string | null | undefined, options_container?: string | null | undefined, special_to_date?: string | null | undefined, items?: Array<{ position?: number | null | undefined, qty?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> }, small_image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, media_gallery?: Array<{ url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined> | null | undefined, description?: { html: string } | null | undefined, short_description?: { html: string } | null | undefined } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, url_key?: string | null | undefined, rating_summary: number, review_count: number, meta_description?: string | null | undefined, meta_keyword?: string | null | undefined, meta_title?: string | null | undefined, options_container?: string | null | undefined, special_to_date?: string | null | undefined, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> }, small_image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, media_gallery?: Array<{ url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined> | null | undefined, description?: { html: string } | null | undefined, short_description?: { html: string } | null | undefined } | { gift_message_available?: string | null | undefined, uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, url_key?: string | null | undefined, rating_summary: number, review_count: number, meta_description?: string | null | undefined, meta_keyword?: string | null | undefined, meta_title?: string | null | undefined, options_container?: string | null | undefined, special_to_date?: string | null | undefined, product_links?: Array<{ link_type?: string | null | undefined, linked_product_sku?: string | null | undefined, linked_product_type?: string | null | undefined, position?: number | null | undefined, sku?: string | null | undefined } | null | undefined> | null | undefined, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> }, small_image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, image?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, media_gallery?: Array<{ url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined> | null | undefined, description?: { html: string } | null | undefined, short_description?: { html: string } | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type ProductReviewQueryVariables = Exact<{ @@ -7262,12 +7141,10 @@ export type ProductReviewQueryVariables = Exact<{ sort?: InputMaybe; }>; - export type ProductReviewQuery = { products?: { items?: Array<{ review_count: number, reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | { review_count: number, reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | { review_count: number, reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | { review_count: number, reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | { review_count: number, reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | { review_count: number, reviews: { items: Array<{ average_rating: number, nickname: string, summary: string, text: string, created_at: string, ratings_breakdown: Array<{ name: string, value: string } | null | undefined>, product: { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } | { name?: string | null | undefined, uid: string } } | null | undefined>, page_info: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } } } | null | undefined> | null | undefined } | null | undefined }; export type ProductReviewRatingsMetadataQueryVariables = Exact<{ [key: string]: never; }>; - export type ProductReviewRatingsMetadataQuery = { productReviewRatingsMetadata: { items: Array<{ id: string, name: string, values: Array<{ value_id: string, value: string } | null | undefined> } | null | undefined> } }; export type ProductsListQueryVariables = Exact<{ @@ -7278,7 +7155,6 @@ export type ProductsListQueryVariables = Exact<{ sort?: InputMaybe; }>; - export type ProductsListQuery = { products?: { total_count?: number | null | undefined, aggregations?: Array<{ attribute_code: string, label?: string | null | undefined, options?: Array<{ label?: string | null | undefined, value: string, count?: number | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, items?: Array<{ uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined, page_info?: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } | null | undefined } | null | undefined }; export type RelatedProductQueryVariables = Exact<{ @@ -7289,21 +7165,18 @@ export type RelatedProductQueryVariables = Exact<{ sort?: InputMaybe; }>; - export type RelatedProductQuery = { products?: { items?: Array<{ uid: string, related_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, related_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, related_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, related_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, related_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, related_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type RemoveCouponFromCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type RemoveCouponFromCartMutation = { removeCouponFromCart?: { cart?: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } | null | undefined } | null | undefined }; export type RemoveItemFromCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type RemoveItemFromCartMutation = { removeItemFromCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type RemoveProductsFromWishlistMutationVariables = Exact<{ @@ -7311,7 +7184,6 @@ export type RemoveProductsFromWishlistMutationVariables = Exact<{ items: Array | Scalars['ID']; }>; - export type RemoveProductsFromWishlistMutation = { removeProductsFromWishlist?: { wishlist: { id?: string | null | undefined, items_count?: number | null | undefined, sharing_code?: string | null | undefined, items_v2?: { items: Array<{ id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | null | undefined>, page_info?: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } | null | undefined } | null | undefined } } | null | undefined }; export type RequestPasswordResetEmailMutationVariables = Exact<{ @@ -7319,7 +7191,6 @@ export type RequestPasswordResetEmailMutationVariables = Exact<{ recaptchaToken?: Scalars['String']; }>; - export type RequestPasswordResetEmailMutation = { requestPasswordResetEmail?: boolean | null | undefined }; export type ResetPasswordMutationVariables = Exact<{ @@ -7329,73 +7200,62 @@ export type ResetPasswordMutationVariables = Exact<{ recaptchaToken?: Scalars['String']; }>; - export type ResetPasswordMutation = { resetPassword?: boolean | null | undefined }; export type RevokeCustomerTokenMutationVariables = Exact<{ [key: string]: never; }>; - export type RevokeCustomerTokenMutation = { revokeCustomerToken?: { result: boolean } | null | undefined }; export type SetBillingAddressOnCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type SetBillingAddressOnCartMutation = { setBillingAddressOnCart?: { cart: { billing_address?: { firstname: string, lastname: string, company?: string | null | undefined, street: Array, city: string, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type SetGuestEmailOnCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type SetGuestEmailOnCartMutation = { setGuestEmailOnCart?: { cart: { email?: string | null | undefined } } | null | undefined }; export type SetPaymentMethodOnCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type SetPaymentMethodOnCartMutation = { setPaymentMethodOnCart?: { cart: { available_payment_methods?: Array<{ code: string, title: string } | null | undefined> | null | undefined, selected_payment_method?: { code: string, title: string } | null | undefined } } | null | undefined }; export type SetShippingAddressesOnCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type SetShippingAddressesOnCartMutation = { setShippingAddressesOnCart?: { cart: { shipping_addresses: Array<{ city: string, company?: string | null | undefined, firstname: string, lastname: string, postcode?: string | null | undefined, street: Array, telephone: string, region?: { code?: string | null | undefined, label?: string | null | undefined, region_id?: number | null | undefined } | null | undefined, country: { code: string, label: string }, available_shipping_methods?: Array<{ available: boolean, carrier_code: string, carrier_title: string, error_message?: string | null | undefined, method_code?: string | null | undefined, method_title?: string | null | undefined, amount: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, price_excl_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, price_incl_tax: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined> | null | undefined } | null | undefined> } } | null | undefined }; export type SetShippingMethodsOnCartMutationVariables = Exact<{ input?: InputMaybe; }>; - export type SetShippingMethodsOnCartMutation = { setShippingMethodsOnCart?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type StoreConfigQueryVariables = Exact<{ [key: string]: never; }>; - export type StoreConfigQuery = { storeConfig?: { allow_guests_to_write_product_reviews?: string | null | undefined, allow_items?: string | null | undefined, allow_order?: string | null | undefined, base_currency_code?: string | null | undefined, catalog_default_sort_by?: string | null | undefined, category_fixed_product_tax_display_setting?: FixedProductTaxDisplaySettings | null | undefined, cms_home_page?: string | null | undefined, cms_no_cookies?: string | null | undefined, cms_no_route?: string | null | undefined, configurable_thumbnail_source?: string | null | undefined, copyright?: string | null | undefined, default_description?: string | null | undefined, default_display_currency_code?: string | null | undefined, default_keywords?: string | null | undefined, default_title?: string | null | undefined, grid_per_page?: number | null | undefined, grid_per_page_values?: string | null | undefined, head_shortcut_icon?: string | null | undefined, header_logo_src?: string | null | undefined, is_default_store?: boolean | null | undefined, is_default_store_group?: boolean | null | undefined, list_mode?: string | null | undefined, list_per_page?: number | null | undefined, list_per_page_values?: string | null | undefined, locale?: string | null | undefined, logo_alt?: string | null | undefined, logo_height?: number | null | undefined, logo_width?: number | null | undefined, magento_wishlist_general_is_enabled?: string | null | undefined, minimum_password_length?: string | null | undefined, no_route?: string | null | undefined, product_fixed_product_tax_display_setting?: FixedProductTaxDisplaySettings | null | undefined, product_reviews_enabled?: string | null | undefined, required_character_classes_number?: string | null | undefined, root_category_uid?: string | null | undefined, sales_fixed_product_tax_display_setting?: FixedProductTaxDisplaySettings | null | undefined, store_code?: string | null | undefined, store_group_code?: string | null | undefined, store_group_name?: string | null | undefined, store_name?: string | null | undefined, store_sort_order?: number | null | undefined, timezone?: string | null | undefined, title_prefix?: string | null | undefined, title_separator?: string | null | undefined, title_suffix?: string | null | undefined, use_store_in_url?: boolean | null | undefined, website_code?: string | null | undefined, website_name?: string | null | undefined, weight_unit?: string | null | undefined, welcome?: string | null | undefined } | null | undefined }; export type SubscribeEmailToNewsletterMutationVariables = Exact<{ email: Scalars['String']; }>; - export type SubscribeEmailToNewsletterMutation = { subscribeEmailToNewsletter?: { status?: SubscriptionStatusesEnum | null | undefined } | null | undefined }; export type UpdateCartItemsMutationVariables = Exact<{ input?: InputMaybe; }>; - export type UpdateCartItemsMutation = { updateCartItems?: { cart: { id: string, email?: string | null | undefined, is_virtual: boolean, total_quantity: number, applied_coupons?: Array<{ code: string } | null | undefined> | null | undefined, prices?: { subtotal_excluding_tax?: { value?: number | null | undefined } | null | undefined, subtotal_including_tax?: { value?: number | null | undefined } | null | undefined, applied_taxes?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, discounts?: Array<{ label: string, amount: { value?: number | null | undefined } } | null | undefined> | null | undefined, grand_total?: { value?: number | null | undefined } | null | undefined } | null | undefined, items?: Array<{ uid: string, quantity: number, bundle_options: Array<{ uid: string, label: string, type: string, values: Array<{ id: number, label: string, price: number, quantity: number } | null | undefined> } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, configurable_options: Array<{ configurable_product_option_uid: string, option_label: string, configurable_product_option_value_uid: string, value_label: string } | null | undefined>, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | { uid: string, quantity: number, product: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } }, prices?: { row_total: { value?: number | null | undefined }, row_total_including_tax: { value?: number | null | undefined }, total_item_discount?: { value?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> | null | undefined, shipping_addresses: Array<{ firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string }, selected_shipping_method?: { carrier_code: string, carrier_title: string, method_code: string, method_title: string, amount: { value?: number | null | undefined, currency?: CurrencyEnum | null | undefined } } | null | undefined } | null | undefined>, billing_address?: { firstname: string, lastname: string, street: Array, city: string, company?: string | null | undefined, postcode?: string | null | undefined, telephone: string, region?: { code?: string | null | undefined, region_id?: number | null | undefined, label?: string | null | undefined } | null | undefined, country: { code: string, label: string } } | null | undefined } } | null | undefined }; export type UpdateCustomerMutationVariables = Exact<{ input: CustomerUpdateInput; }>; - export type UpdateCustomerMutation = { updateCustomerV2?: { customer: { date_of_birth?: string | null | undefined, default_billing?: string | null | undefined, default_shipping?: string | null | undefined, email?: string | null | undefined, firstname?: string | null | undefined, is_subscribed?: boolean | null | undefined, lastname?: string | null | undefined, middlename?: string | null | undefined, prefix?: string | null | undefined, suffix?: string | null | undefined, taxvat?: string | null | undefined, addresses?: Array<{ city?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, firstname?: string | null | undefined, id?: number | null | undefined, lastname?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region_code?: string | null | undefined, region_id?: number | null | undefined, region?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } } | null | undefined }; export type UpdateCustomerAddressMutationVariables = Exact<{ @@ -7403,7 +7263,6 @@ export type UpdateCustomerAddressMutationVariables = Exact<{ input?: InputMaybe; }>; - export type UpdateCustomerAddressMutation = { updateCustomerAddress?: { id?: number | null | undefined, city?: string | null | undefined, company?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, fax?: string | null | undefined, firstname?: string | null | undefined, lastname?: string | null | undefined, middlename?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region?: string | null | undefined, region_code?: string | null | undefined, region_id?: number | null | undefined } | null | undefined } | null | undefined }; export type UpdateCustomerEmailMutationVariables = Exact<{ @@ -7412,7 +7271,6 @@ export type UpdateCustomerEmailMutationVariables = Exact<{ recaptchaToken?: Scalars['String']; }>; - export type UpdateCustomerEmailMutation = { updateCustomerEmail?: { customer: { date_of_birth?: string | null | undefined, default_billing?: string | null | undefined, default_shipping?: string | null | undefined, email?: string | null | undefined, firstname?: string | null | undefined, is_subscribed?: boolean | null | undefined, lastname?: string | null | undefined, middlename?: string | null | undefined, prefix?: string | null | undefined, suffix?: string | null | undefined, taxvat?: string | null | undefined, addresses?: Array<{ city?: string | null | undefined, country_code?: CountryCodeEnum | null | undefined, default_billing?: boolean | null | undefined, default_shipping?: boolean | null | undefined, firstname?: string | null | undefined, id?: number | null | undefined, lastname?: string | null | undefined, postcode?: string | null | undefined, prefix?: string | null | undefined, street?: Array | null | undefined, suffix?: string | null | undefined, telephone?: string | null | undefined, vat_id?: string | null | undefined, extension_attributes?: Array<{ attribute_code?: string | null | undefined, value?: string | null | undefined } | null | undefined> | null | undefined, region?: { region_code?: string | null | undefined, region_id?: number | null | undefined, region?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } } | null | undefined }; export type UpsellProductsQueryVariables = Exact<{ @@ -7423,14 +7281,12 @@ export type UpsellProductsQueryVariables = Exact<{ sort?: InputMaybe; }>; - export type UpsellProductsQuery = { products?: { items?: Array<{ uid: string, upsell_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, upsell_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, upsell_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, upsell_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, upsell_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | { uid: string, upsell_products?: Array<{ __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined> | null | undefined } | null | undefined> | null | undefined } | null | undefined }; export type UrlResolverQueryVariables = Exact<{ url: Scalars['String']; }>; - export type UrlResolverQuery = { urlResolver?: { id?: number | null | undefined, redirectCode?: number | null | undefined, relative_url?: string | null | undefined, type?: UrlRewriteEntityTypeEnum | null | undefined, entity_uid?: string | null | undefined } | null | undefined }; export type WishlistQueryVariables = Exact<{ @@ -7438,5 +7294,4 @@ export type WishlistQueryVariables = Exact<{ pageSize?: InputMaybe; }>; - export type WishlistQuery = { customer?: { wishlists: Array<{ id?: string | null | undefined, items_count?: number | null | undefined, sharing_code?: string | null | undefined, items_v2?: { items: Array<{ id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | { id: string, quantity: number, description?: string | null | undefined, added_at: string, product?: { __typename: 'BundleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, items?: Array<{ sku?: string | null | undefined, title?: string | null | undefined, options?: Array<{ uid: string, quantity?: number | null | undefined, product?: { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | { uid: string, sku?: string | null | undefined, name?: string | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } } } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'ConfigurableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, configurable_options?: Array<{ attribute_code?: string | null | undefined, attribute_uid: string, label?: string | null | undefined, position?: number | null | undefined, uid: string, use_default?: boolean | null | undefined, values?: Array<{ label?: string | null | undefined, uid?: string | null | undefined, swatch_data?: { value?: string | null | undefined } | { value?: string | null | undefined } | { value?: string | null | undefined } | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'DownloadableProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'GroupedProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'SimpleProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | { __typename: 'VirtualProduct', uid: string, sku?: string | null | undefined, name?: string | null | undefined, stock_status?: ProductStockStatus | null | undefined, only_x_left_in_stock?: number | null | undefined, rating_summary: number, url_key?: string | null | undefined, review_count: number, categories?: Array<{ uid: string, name?: string | null | undefined, url_suffix?: string | null | undefined, url_path?: string | null | undefined, breadcrumbs?: Array<{ category_name?: string | null | undefined, category_url_path?: string | null | undefined } | null | undefined> | null | undefined } | null | undefined> | null | undefined, price_range: { maximum_price?: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } | null | undefined, minimum_price: { final_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined }, regular_price: { currency?: CurrencyEnum | null | undefined, value?: number | null | undefined } } }, thumbnail?: { url?: string | null | undefined, position?: number | null | undefined, disabled?: boolean | null | undefined, label?: string | null | undefined } | null | undefined, url_rewrites?: Array<{ url?: string | null | undefined } | null | undefined> | null | undefined, reviews: { items: Array<{ average_rating: number, ratings_breakdown: Array<{ name: string, value: string } | null | undefined> } | null | undefined> } } | null | undefined } | null | undefined>, page_info?: { current_page?: number | null | undefined, page_size?: number | null | undefined, total_pages?: number | null | undefined } | null | undefined } | null | undefined } | null | undefined> } | null | undefined }; diff --git a/packages/composables/src/composables/useExternalCheckout/index.ts b/packages/composables/src/composables/useExternalCheckout/index.ts index da115ab25..f96c4b6b8 100644 --- a/packages/composables/src/composables/useExternalCheckout/index.ts +++ b/packages/composables/src/composables/useExternalCheckout/index.ts @@ -26,14 +26,14 @@ const factoryParams: UseExternalCheckoutFactoryParams = { } */ window.location.replace(`${externalCheckout.cmsUrl}${externalCheckout.syncUrlPath}/token/${userToken}/cart/${cartToken}`); - return Promise.resolve(''); + return ''; } window.location.replace(`${externalCheckout.cmsUrl}${externalCheckout.syncUrlPath}/token//cart/${cartToken}`); - return Promise.resolve(''); + return ''; } - return Promise.resolve(params.baseUrl); + return params.baseUrl; }, }; diff --git a/packages/composables/src/getters/reviewGetters.ts b/packages/composables/src/getters/reviewGetters.ts index f9c75790e..ec2cae0f0 100644 --- a/packages/composables/src/getters/reviewGetters.ts +++ b/packages/composables/src/getters/reviewGetters.ts @@ -16,16 +16,16 @@ export const getReviewAuthor = (item: ProductReview): string => item.nickname; export const getReviewMessage = (item: ProductReview): string => item.text; -export const getReviewRating = (item: ProductReview): number => Number.parseInt(item.ratings_breakdown.find((r) => r.name === 'Rating')?.value, - 10) || 0; +export const getReviewRating = (item: ProductReview): number => Number.parseInt( + item.ratings_breakdown.find((r) => r.name === 'Rating')?.value, + 10, +) || 0; export const getReviewDate = (item: ProductReview): string => item.created_at; export const getTotalReviews = (review: ProductReviews): number => review?.review_count || 0; -export const getAverageRating = (review): number => (review?.reviews?.items?.reduce(( - acc, curr, -) => Number.parseInt(`${acc}`, 10) + getReviewRating(curr), 0)) / (review?.review_count || 1) || 0; +export const getAverageRating = (review): number => (review?.reviews?.items?.reduce((acc, curr) => Number.parseInt(`${acc}`, 10) + getReviewRating(curr), 0)) / (review?.review_count || 1) || 0; export const getRatesCount = (_review: ProductReviews): AgnosticRateCount[] => []; diff --git a/packages/composables/src/getters/storeConfigGetters.ts b/packages/composables/src/getters/storeConfigGetters.ts index 35b4a6f9c..9256211c4 100644 --- a/packages/composables/src/getters/storeConfigGetters.ts +++ b/packages/composables/src/getters/storeConfigGetters.ts @@ -1,4 +1,4 @@ -import { StoreConfig } from '@vue-storefront/magento-api';; +import { StoreConfig } from '@vue-storefront/magento-api'; const getCode = (config: StoreConfig) => config.store_code; const getTitle = (config: StoreConfig) => config.default_title; diff --git a/packages/theme/components/ProductsCarousel.vue b/packages/theme/components/ProductsCarousel.vue index 714dc375b..3e967909c 100644 --- a/packages/theme/components/ProductsCarousel.vue +++ b/packages/theme/components/ProductsCarousel.vue @@ -77,7 +77,7 @@ import { SfProductCard, SfSection, SfLoader, - SfButton + SfButton, } from '@storefront-ui/vue'; import { diff --git a/packages/theme/components/RelatedProducts.vue b/packages/theme/components/RelatedProducts.vue index 7c9b3c3ea..22a31179f 100644 --- a/packages/theme/components/RelatedProducts.vue +++ b/packages/theme/components/RelatedProducts.vue @@ -1,6 +1,6 @@ diff --git a/packages/theme/components/Notification.vue b/packages/theme/components/Notification.vue index cc6993bca..24a8a9756 100644 --- a/packages/theme/components/Notification.vue +++ b/packages/theme/components/Notification.vue @@ -14,13 +14,11 @@ @click:close="notification.dismiss" @click:action="notification.action && notification.action.onClick()" > - @@ -29,14 +27,15 @@ + From d879b756537017ac87de4efc48600592e713fdc5 Mon Sep 17 00:00:00 2001 From: Kevin Gorjan Date: Fri, 25 Feb 2022 10:31:01 +0100 Subject: [PATCH 146/486] fix(theme): refactored when clicking outside the search-results --- .../components/Header/SearchBar/SearchBar.vue | 23 +++++++++++++++---- .../click-outside/click-outside-directive.js | 19 +++++++++++++++ 2 files changed, 38 insertions(+), 4 deletions(-) create mode 100644 packages/theme/utilities/directives/click-outside/click-outside-directive.js diff --git a/packages/theme/components/Header/SearchBar/SearchBar.vue b/packages/theme/components/Header/SearchBar/SearchBar.vue index fd590adc3..4c6dd1eeb 100644 --- a/packages/theme/components/Header/SearchBar/SearchBar.vue +++ b/packages/theme/components/Header/SearchBar/SearchBar.vue @@ -51,7 +51,7 @@ + + From 32d8ad89e4c538cd91cd882527d2d545acd9287c Mon Sep 17 00:00:00 2001 From: Kevin Gorjan Date: Fri, 25 Feb 2022 11:10:31 +0100 Subject: [PATCH 148/486] fix(theme): refactored watcher --- packages/theme/components/Header/SearchBar/SearchBar.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/theme/components/Header/SearchBar/SearchBar.vue b/packages/theme/components/Header/SearchBar/SearchBar.vue index dad69cfd7..5cc7ea915 100644 --- a/packages/theme/components/Header/SearchBar/SearchBar.vue +++ b/packages/theme/components/Header/SearchBar/SearchBar.vue @@ -160,8 +160,9 @@ export default defineComponent({ emit('SearchBar:result', result.value); }, 1000); - watch(route, (event) => { - closeSearch(event); + watch(route, () => { + hideSearch(); + term.value = ''; }); return { From cf9518fe11f416a47b9bead0b523556f8c8d6348 Mon Sep 17 00:00:00 2001 From: Marcin Kwiatkowski Date: Mon, 28 Feb 2022 08:16:55 +0100 Subject: [PATCH 149/486] chore: updated readme --- packages/theme/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/theme/README.md b/packages/theme/README.md index 4eef5ade4..0d7928a01 100644 --- a/packages/theme/README.md +++ b/packages/theme/README.md @@ -5,13 +5,6 @@ # Magento 2.x theme ### Vue Storefront 2 integration with Magento - -This theme developed by superheroes from [Caravel](https://github.com/caravelx) ❤️ - -
- -
- ### Requirements: - NodeJS v16 or later From 4c3de2d7a595913e9146feec559d4c9f7b307ee1 Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Wed, 23 Feb 2022 14:47:51 +0100 Subject: [PATCH 150/486] refactor(theme): category page refactoring step-1 - separate category page and sidebar logic - add resolving layput configuration on category page - move navbar to a separate component - add redis cache for the sidebar - add empty results page --- .../components/Category/CategoryNavbar.vue | 289 +++++ ...orySidebarMenu.vue => CategorySidebar.vue} | 81 +- .../theme/components/Category/CmsContent.vue | 19 + .../components/Category/EmptyResults.vue | 38 + .../Category/categoryContent.gql.ts | 15 + .../Category/enums/displayModesEnum.ts | 7 + .../components/Category/useCategoryContent.ts | 44 + packages/theme/composables/useApi/index.ts | 4 +- packages/theme/lang/de.js | 3 +- packages/theme/lang/en.js | 3 +- packages/theme/pages/Category.vue | 1003 ++++++----------- 11 files changed, 789 insertions(+), 717 deletions(-) create mode 100644 packages/theme/components/Category/CategoryNavbar.vue rename packages/theme/components/Category/{CategorySidebarMenu.vue => CategorySidebar.vue} (69%) create mode 100644 packages/theme/components/Category/CmsContent.vue create mode 100644 packages/theme/components/Category/EmptyResults.vue create mode 100644 packages/theme/components/Category/categoryContent.gql.ts create mode 100644 packages/theme/components/Category/enums/displayModesEnum.ts create mode 100644 packages/theme/components/Category/useCategoryContent.ts diff --git a/packages/theme/components/Category/CategoryNavbar.vue b/packages/theme/components/Category/CategoryNavbar.vue new file mode 100644 index 000000000..fa137cbe0 --- /dev/null +++ b/packages/theme/components/Category/CategoryNavbar.vue @@ -0,0 +1,289 @@ + + + + diff --git a/packages/theme/components/Category/CategorySidebarMenu.vue b/packages/theme/components/Category/CategorySidebar.vue similarity index 69% rename from packages/theme/components/Category/CategorySidebarMenu.vue rename to packages/theme/components/Category/CategorySidebar.vue index 3e1286240..889cb3aa5 100644 --- a/packages/theme/components/Category/CategorySidebarMenu.vue +++ b/packages/theme/components/Category/CategorySidebar.vue @@ -1,13 +1,8 @@ - - diff --git a/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressEdit.vue b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressEdit.vue new file mode 100644 index 000000000..79374e677 --- /dev/null +++ b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressEdit.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/packages/theme/modules/customer/components/AddressForm.vue b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressForm.vue similarity index 92% rename from packages/theme/modules/customer/components/AddressForm.vue rename to packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressForm.vue index 774a7ace4..80dd4524f 100644 --- a/packages/theme/modules/customer/components/AddressForm.vue +++ b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressForm.vue @@ -140,7 +140,7 @@ required :valid="!errors[0]" :error-message="$t(errors[0])" - @input="reloadCountry({ id: $event })" + @input="updateCountry({ id: $event })" > - {{ isNew ? $t('Add the address') : $t('Update the address') }} + - + + diff --git a/packages/theme/modules/customer/pages/AddressesDetails.vue b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressesDetails.vue similarity index 55% rename from packages/theme/modules/customer/pages/AddressesDetails.vue rename to packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressesDetails.vue index fc7ed3503..113addad3 100644 --- a/packages/theme/modules/customer/pages/AddressesDetails.vue +++ b/packages/theme/modules/customer/pages/MyAccount/AddressesDetails/AddressesDetails.vue @@ -1,37 +1,11 @@ - + + diff --git a/packages/theme/modules/customer/pages/MyNewsletter.vue b/packages/theme/modules/customer/pages/MyAccount/MyNewsletter.vue similarity index 91% rename from packages/theme/modules/customer/pages/MyNewsletter.vue rename to packages/theme/modules/customer/pages/MyAccount/MyNewsletter.vue index 0154f5332..ec7e355c7 100644 --- a/packages/theme/modules/customer/pages/MyNewsletter.vue +++ b/packages/theme/modules/customer/pages/MyAccount/MyNewsletter.vue @@ -1,8 +1,5 @@ - + + diff --git a/packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts b/packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts new file mode 100644 index 000000000..7f3032b2e --- /dev/null +++ b/packages/theme/modules/customer/pages/MyAccount/useSidebarLinkGroups.ts @@ -0,0 +1,62 @@ +import type { RawLocation } from 'vue-router'; +import { useRouter, useContext } from '@nuxtjs/composition-api'; +import { useUser } from '~/modules/customer/composables/useUser'; +import { useCart } from '~/modules/checkout/composables/useCart'; + +type LinkGroup = { title: string, items: LinkGroupItem[] }; +type LinkGroupItem = { label: string, link?: RawLocation, listeners?: Record (Promise | void)> }; + +export const useSidebarLinkGroups = () => { + const { localeRoute } = useContext(); + const { logout } = useUser(); + const { clear } = useCart(); + + const router = useRouter(); + const sidebarLinkGroups : LinkGroup[] = [ + { + title: 'Personal details', + items: [ + { + label: 'My profile', + link: { name: 'customer-my-profile' }, + }, + { + label: 'Addresses details', + link: { name: 'customer-addresses-details' }, + }, + { + label: 'My newsletter', + link: { name: 'customer-my-newsletter' }, + }, + { + label: 'My wishlist', + link: { name: 'customer-my-wishlist' }, + }, + ], + }, + { + title: 'Order details', + items: [ + { + label: 'Order history', + link: { name: 'customer-order-history' }, + }, + { + label: 'My reviews', + link: { name: 'customer-my-reviews' }, + }, + { + label: 'Log out', + listeners: { + click: async () => { + await Promise.all([logout({}), clear({})]); + await router.push(localeRoute({ name: 'home' })); + }, + }, + }, + ], + }, + ]; + + return { sidebarLinkGroups }; +}; diff --git a/packages/theme/modules/customer/types/form.ts b/packages/theme/modules/customer/types/form.ts new file mode 100644 index 000000000..5dd8422e3 --- /dev/null +++ b/packages/theme/modules/customer/types/form.ts @@ -0,0 +1,8 @@ +export type OnFormComplete = () => void; +export type OnFormError = (message: string) => void; + +export type SubmitEventPayload = { + form: TForm, + onComplete: OnFormComplete, + onError: OnFormError, +}; diff --git a/packages/theme/plugins/fcPlugin.ts b/packages/theme/plugins/fcPlugin.ts index 759eb20db..97813cbb1 100644 --- a/packages/theme/plugins/fcPlugin.ts +++ b/packages/theme/plugins/fcPlugin.ts @@ -1,11 +1,19 @@ import { Plugin } from '@nuxt/types'; import formatCurrency from '~/helpers/formatCurrency'; +interface FormatCurrency { + $fc(value: number | string): string; + $fc(value: number | string, options?: Intl.NumberFormatOptions): string; + $fc(value: number | string, locale?: string, options?: Intl.NumberFormatOptions): string; +} + declare module 'vue/types/vue' { - interface Vue { - $fc(value: number | string): string; - $fc(value: number | string, options?: Intl.NumberFormatOptions): string; - $fc(value: number | string, locale?: string, options?: Intl.NumberFormatOptions): string; + interface Vue extends FormatCurrency { + } +} + +declare module '@nuxt/types' { + interface Context extends FormatCurrency { } } diff --git a/packages/theme/stores/customer.ts b/packages/theme/stores/customer.ts index d7331b958..8686f3403 100644 --- a/packages/theme/stores/customer.ts +++ b/packages/theme/stores/customer.ts @@ -1,10 +1,9 @@ import { defineStore } from 'pinia'; -import type { Cart } from '~/modules/GraphQL/types'; -import type { User } from '~/modules/customer/composables/useUser/useUser'; +import type { Cart, Customer } from '~/modules/GraphQL/types'; interface CustomerState { cart: Cart, - user: User | null, + user: Customer | null, isLoggedIn: boolean, } From 38888dedf5513b52b74268e03e83d77926cb0fb4 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Fri, 13 May 2022 12:22:07 +0200 Subject: [PATCH 357/486] fix: sfcontentpages style missing on myaccount develop --- packages/theme/modules/customer/pages/MyAccount/MyAccount.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue b/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue index a8d0d854a..f63ed99dc 100644 --- a/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue +++ b/packages/theme/modules/customer/pages/MyAccount/MyAccount.vue @@ -100,6 +100,8 @@ export default defineComponent({ diff --git a/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder.vue b/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder.vue index 837759d87..27b5e418a 100644 --- a/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder.vue +++ b/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder.vue @@ -4,7 +4,7 @@ data-cy="order-history-tab_my-orders" :title="$t('My orders')" > -
+
@@ -24,31 +24,94 @@ {{ $t('Price') }} - {{ item.name }} + {{ item.product_name }}
{{ option.label }} {{ option.value }}
- {{ item.quantity }} - {{ $fc(item.price) }} + {{ item.quantity_ordered }} + {{ $fc(item.product_sale_price.value) }}
- + + + + + + + + + + + + + + + + + + + + - - {{ property.name }} - {{ property.value }} - + + + + + + + + + + + + + + + +
@@ -63,10 +126,13 @@ import { SfLoader, } from '@storefront-ui/vue'; import { - computed, defineComponent, useAsync, useContext, + defineComponent, useAsync, useContext, } from '@nuxtjs/composition-api'; import { useUserOrder } from '~/modules/customer/composables/useUserOrder'; -import { orderGetters } from '~/getters'; +import orderGetters from '~/modules/checkout/getters/orderGetters'; +import OrderSummaryRow from '~/modules/customer/pages/MyAccount/OrderHistory/OrderSummaryRow.vue'; +import OrderSummaryAddressRow from '~/modules/customer/pages/MyAccount/OrderHistory/OrderSummaryAddressRow.vue'; +import { useCountrySearch } from '~/composables'; export default defineComponent({ name: 'SingleOrder', @@ -75,62 +141,36 @@ export default defineComponent({ SfTable, SfTabs, SfLoader, + OrderSummaryRow, + OrderSummaryAddressRow, }, props: { orderId: { type: String, required: true } }, setup(props) { const context = useContext(); const { search, loading } = useUserOrder(); - const currentOrderRawData = useAsync(() => search({ filter: { number: { eq: props.orderId } } }), props.orderId); - - const currentOrder = computed(() => { - const order = currentOrderRawData.value?.items[0] ?? null; + const { search: searchCountries } = useCountrySearch(); + const asyncData = useAsync(async () => { + const orderResult = await search({ filter: { number: { eq: props.orderId } } }); + const order = orderResult.items[0] ?? null; - if (order === null) { - return null; - } + const uniqueCountryCodePromises = [...new Set([order.shipping_address.country_code, order.billing_address.country_code])] + .map((countryCode) => searchCountries({ id: countryCode })); + const countries = await Promise.all(uniqueCountryCodePromises); return { - properties: [ - { - name: context.i18n.t('Order ID'), - value: orderGetters.getId(order), - }, - { - name: context.i18n.t('Date'), - value: orderGetters.getDate(order), - }, - { - name: context.i18n.t('Status'), - value: orderGetters.getStatus(order), - }, - { - name: context.i18n.t('Price'), - value: context.$fc(orderGetters.getPrice(order)), - }, - ], - items: order.items?.map(({ - product_sku, - product_name, - quantity_ordered = 0, - product_sale_price = { value: 0 }, - selected_options = [], - }) => ({ - key: product_sku, - name: product_name, - configurableProductOptions: selected_options, - quantity: quantity_ordered, - price: product_sale_price.value ?? 0, - })) ?? [], + order, + countries, }; }); const ordersRoute = context.localeRoute({ name: 'customer-order-history' }); return { - currentOrder, loading, ordersRoute, - currentOrderRawData, + asyncData, + getDate: orderGetters.getDate, + getStatus: orderGetters.getStatus, }; }, }); @@ -179,50 +219,6 @@ export default defineComponent({ } } -.order-summary { - position: relative; - display: block; - background-color: var(--c-light); - pointer-events: none; - - @include for-mobile { - &:before, - &:after { - content: ""; - position: absolute; - display: block; - background-color: var(--c-light); - top: 0; - height: 100%; - width: var(--spacer-sm); - } - - &:before { - left: calc(-1 * var(--spacer-sm)); - } - - &:after { - right: calc(-1 * var(--spacer-sm)); - } - } - - ::v-deep tr { - --table-row-padding: var(--spacer-xs) var(--spacer-sm); - } - - &:last-of-type { - td { - --table-data-font-weight: var(--font-weight--semibold); - } - } - - &__spacer { - @include for-desktop { - --table-column-flex: 2; - } - } -} - .products { box-sizing: border-box; flex: 1; From a768bbc3a959b3e0a1224dcb4974db74af4c70f8 Mon Sep 17 00:00:00 2001 From: Vitor Luiz Cavalcanti Date: Thu, 5 May 2022 02:04:35 -0300 Subject: [PATCH 366/486] docs: add Asciinema component --- docs/.vuepress/components/Asciinema.vue | 31 +++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 docs/.vuepress/components/Asciinema.vue diff --git a/docs/.vuepress/components/Asciinema.vue b/docs/.vuepress/components/Asciinema.vue new file mode 100644 index 000000000..20e401191 --- /dev/null +++ b/docs/.vuepress/components/Asciinema.vue @@ -0,0 +1,31 @@ + + + From 8e7246fcdd83b14347b19e57f2210e050afa3fae Mon Sep 17 00:00:00 2001 From: Vitor Luiz Cavalcanti Date: Tue, 10 May 2022 02:47:31 -0300 Subject: [PATCH 367/486] docs: refactor Creating a Store docs --- .../magento-marketplace-access-key-form.jpg | Bin 0 -> 27038 bytes .../magento-marketplace-access-keys-link.jpg | Bin 0 -> 20668 bytes .../magento-marketplace-access-keys.jpg | Bin 0 -> 21995 bytes ...o-marketplace-create-access-key-button.jpg | Bin 0 -> 14206 bytes .../images/magento-marketplace-link.jpg | Bin 0 -> 21088 bytes .../magento-marketplace-my-profile-link.jpg | Bin 0 -> 20019 bytes .../magento-marketplace-signin-form.jpg | Bin 0 -> 26312 bytes docs/guide/creating-a-store.md | 117 ++++++++++++------ 8 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 docs/assets/images/magento-marketplace-access-key-form.jpg create mode 100644 docs/assets/images/magento-marketplace-access-keys-link.jpg create mode 100644 docs/assets/images/magento-marketplace-access-keys.jpg create mode 100644 docs/assets/images/magento-marketplace-create-access-key-button.jpg create mode 100644 docs/assets/images/magento-marketplace-link.jpg create mode 100644 docs/assets/images/magento-marketplace-my-profile-link.jpg create mode 100644 docs/assets/images/magento-marketplace-signin-form.jpg diff --git a/docs/assets/images/magento-marketplace-access-key-form.jpg b/docs/assets/images/magento-marketplace-access-key-form.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53222f8027c9ed2883aaf461e20c2226c2287154 GIT binary patch literal 27038 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/magento-marketplace-access-keys-link.jpg b/docs/assets/images/magento-marketplace-access-keys-link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6dfbafce5df9904dd391bc822c217279e9b2748b GIT binary patch literal 20668 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 IA9?nF0ppU2;s5{u literal 0 HcmV?d00001 diff --git a/docs/assets/images/magento-marketplace-access-keys.jpg b/docs/assets/images/magento-marketplace-access-keys.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1cb6f6e8b3a53c874e1d40b9d38d318f8cd6ca65 GIT binary patch literal 21995 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 Ilri*w0K^;wz5oCK literal 0 HcmV?d00001 diff --git a/docs/assets/images/magento-marketplace-link.jpg b/docs/assets/images/magento-marketplace-link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4c1d3276696614bfb344894489a6a2f44db7ab98 GIT binary patch literal 21088 zcmeIa2V7I%moFNm34$on5uySDBA_TBH7e3Y1f`d#fHWb3lmLM!3P@KFP*5TQ(m_h- zB+>;`dJ82Gnv_UF2?0X#j`QxF`}_az%)I;Fy!W4ZpF1bn$vN5QWUsZ)E^B?)cOS+W zV+M50NY79Y#Kgn|x(B>Kj9JhbUAX&05Xi&?bPfap9R~7vLCnA&6Y%<{jWGez0Ucsu z`t$y88#62OpN)-$g_)I|jh+2ZI?Qo|-wfBxjp z<$taM-du;-5C1vi|K7&<3Oat6>CPc1W~MWsL&uqzk25jaKwv;tRzRaaO8vKu=@2su zD;ppZ=Mmrp^f5quX68eHu&gXBz}cZdK8WQwEAQ!x*Vs;&-Df}J!>9D@b=F~t>*dY- z=KUneOAma*IXDFbg@i?<&PvP3p1Z89qIyM5UFU|bp1y&h(Ve>%mR8m_wocA24_)2d zJ)Zda2L!@{f}g*Lh>Us}9g~#&CM7lP?Ys0(**UqN^YRM{D=Mqd)it$s^)0P!?H!%p zy1EAjhlWQ+$HsB9gt_^J#id`%E98yMt!>H zUrknTX{^+UV)!5-uj7a6oyL8Wv=<0>ubkzJy9Ov{H1g=Lnt1WMhjwclYD0h8V1wd_ z79i%q{7*3;nSW4{n@3GV(K&4xAg+BvlW}vH;6T_oA@<7Lz6tRc1EgE2q?e@7#;#P| z$^N16sP@hoOm$f|m@4ze7((Ma(nkJP_-jY~LB*GE_a2q_9xi)E2CH?rjN5zM%k7c< zp?6^JlN_+NWqW`_6~ZB{bz!g%KT}XK=RA8gW!J=M>jTWbc(U(CZI%KSJ9{f^?2t5`JbqDkt{tpghf~ z$l>~fx~AdNN1q-KKNFjhIJPmjKRgyTf)qo}CWnD0sn3o3iHagW4T_7`Hs>eW?1|>r z6YFb#4tMy(C1gJbO7)v*S7f~a-l%a`$dezy%*47CiU z)5#l-;4a_E0ily7WTCn|Y1yJ2^r&4?12Skg``4A&*ei)wy3Rd>E7&U>dh>BkPLlzXH0TG|Ob zJS&dMb^XQZcNQj>W2H8A#7CKz;+3@ZSZ3~B0CE08&Q$JcWl^0T3JKgz=>!bo8-zRH_YVP~`MB17}!f!NvCD^RYl@3dUA6~aX9;1ck(Bw$sXo6QT@sS^tXWS$oZ?BZPaWDEv!@Wbd z_)S5)rl1p02q2OSUCtxy;z61ODKI*NE@%2eJ&w*X(jPtP_P6n5~84C&J{Z{g0?H&86SNZH$Tj9MP6rN12Ig01O zX9RfPmUbbwL!5m`dZNh?>*G6gj^r|G zQJbLIa+nzDC$@NU@|)m+z54|wi;(gw7G_$lB`e3p#$yr5d zdfG5lFwG~g>Sot@-VPIewf!^kb))rKabo=^CN3rMa>FjHx1i4I;75Op z2KgTu=W_IIs_2z46fJx!a>hmsDrKwk^P+u1^u8a$fI8~rQ-+YB3J1-BnIrwbj4Gq} zuFYJ)r3YH@u(s<`e~{sE1o79 z#y>r^UO(gf$LXYG>;F7qi67(K%Xpu&gr-EoczE(n^1)p&=$knE$@v!RaCaKGk%-% zZqzv%zVyw_7ObTEB%W>zQZt{H0`9vRHDj)U0g6hmjtU}mue7#Q!n5rfP;GgRl}Q?& z*^g~Xw7=*5d{C0I2^#Zx-3|&R>LQxJG(PrrsBq)`VjBbx)!3h`c#TAyPY-2)qRVL4 z*rIZNJOSfl`lqBq-iJ=DWHFtZFEF11Hz!VnnZ~G>#WaeQ!d0zF?Cpu1%bn&Kts=1{ zJ2+y(b$gr%$3)=K^*3v{3A+7JZcxZJ9J^M>07cc5PEDg@s(KI3pv#84X=6ZFPNes0D-J?Dnshp$W21uN{KLN= zaRpN5ei(2)zIKG;>LTRb(IfXx#_{^HFNU3)T^a6nuQ&5uC=ggHbLo)^9Cs)|^o}=j zcihfGSy(J)_v)F&2%Ym`sH7WHUfB#rO?3K@^1#(7i9-7fI4n+&wKW%K&{L zGe84y&tgD|N@UkZN936KAOmz=xeFMLgs}53;Cb}cP6o(uw%7-};b6`Hm6-y~OZ@_J zcf&8-A-o2ancWMqpX z+j6~0{9rVaIp4w5^k&gJ~Bp1wd7%s%2Jwca|wT zQEplue8$31u~?yp2Rl(TKEc_V2%*FjTI30jOJz>=v*E?D!@hO9p8eRFEN}&;Xy1n3 zJEu>=t42ft8N8-Tw)zS=jGTFeksJz> zbdw|W9(90s(0}-WE9HAutxSU>r>7)fDQ~|OPHr8xLx-y6!aFHB)M$6E5p52t4r!nR zKKe*xu{@{*j|L%wi4v^n@~NYgmiLohwJ zTXr_5vMNca-&xD*=j-r!UQwZsJTFU}>XB5*#pImTz2|thQSeDCQ?gX^OMR{pDDKhV zCF$=4qDK6b4JL__uv&eQc9Fuu!u+qGdrVLsg!DnYJjA7JY@dK_1;^u1k!Pu3Wm=7T zK%?SA`rt;Xx1iG$TcYz5ed$*^pJ%a27nDMfM-VIrd5srmJ)s=SNRdY70=VOq8v+<< z4C#9%H9-!+1U>|-=$_@->trdv-6<6hLX47e3=sWz*;5GVwwk7N%}%C7RSdGSoO!2z zLW=&F2hvzOsTIhTkiA^?A`M*iGm(_ns*=tViFNhsBl=}n`z=6^uTbq=B3Q0I_?B2J zn5Db~I3*^?r`r6(okXo!8K*`v&(m!fUrp3vBL+p}^;F7@(M3ua)66gb{QbR_3ANAx z5({jFM4+mA*WS&_A(`Rk&?qopBRIQF-j7?qO+DggT9G@Yr|q%*OG1)bs#HtSY0J|= z%+Ic##8mF9A#6yWYxZ>!W@HjIFwcfMF`L`*K`ScKU$iG%ez>ISlPtcs=B3XObyvxR ziyfXg$jn<26HF{HyKGY-+{Lmiu-RC{ajUGP8=GR7;T zn}{}+{A5nxwaSN(5HG&ey;~{A&`C$^G#=|1oQnHqtR{+AJN0F07~*XD!Zz(Ics%5* zHpj@>^15M!d=_pw&3C*(t1(Ge$ns*U#e8h*%no@OF(%FzJHd0CjS7SKt*LapobT$o;LW|DRnseUM zQ!!Fr!FjBfjc|8US~|J+{f6`2o?qz^N`1JN9Gw%nFN6M7#Wp`ojhYfij9{@nWik%oms@F@08n~YBcQkWuktoxM!Ltd?`WA z($oLpL(!)`Nop%0JmWi*JLHtn&i%wVs1Q1y-I6>R?CFLRPyU#btxx)qanYT{ONQ4( zGiu$ayH?mNr30iLQzm$j2AQu78vs+xydc}Wq=gXOe`%(cVaENVT+u(}$X4i8baZzY z7hkw0%yK9HBaiF>F!{Lltm8aqOm-r+rmm0P!UPfO!;N1&jK(P$=*e|IM>R5aW|jT0 zo9K;0eu2G&RXy`Bf!|n(`PQLTVT0##`X2q#ZTzXk67<89#5ZK<7k(>?zBTmNtnsRb zU3*Q6YqV>$^YL$uMWr*3Tgy+zP{X8W(t~p0bC0)k^%^bSq)F{!G!_DPhO*)!Miy35`lQFDmU81K{Vi~@VtZ`$H>8v1i_c7p@KIDx80OK zqwY?Q)>n2aeSiF7efQgih&xDMJ68RmKmnAyeA|ZPg_cM|v7h{WTuG)M z`K91k;&_Qi8iWNq%T3x+*>RMlz6;J2{8E!nB=Q<8SS69u?;47qN;Pv(eVgBIz#@Bv zeVHdw%d}bhNC#wMh>2s6MWy`%=mBp>xlgAt`3#=grlD0o+=33a*j&dEA-!fh6 z^im8*1d?4_O-ej*sZp~{0b|QccEfo?dF3%)N&`U>`?{@-KZIV--;)fOsC{~U2E=o- ziW>b9PhHt;A+3t|Va^N^&G(i}Y=)+;F((zs>3?W8WMPiGL(`x8px9#D@hope5bD}M z*4=kccMiK#gYy;`38}uBf7*w&cs=zL;_XkuM;es0X-m$GpIhfbAcizmXZOLJ)WNn5 z(IyN3uK8ifzHL~g^>UZ|yGm<9JU1rg61b|?-e|(=yH}N_=p2e_f{{X;8&cFX%l8C} z71JC_waaETh+%$-x_A4whoY^FHU)%AhT|)w#$ulo_v|n7ZZJ{O+NlUt)fN;lvc<*A zJ#hBQR!_A5%hHk`ZHjK?mB#fKIPQNr@s#7rj4S`v)8#oy}?-)QNR>CW1@h^jGBEz^>(x8WE_X#{g%hgD( z#simxIv;|liJ;Zyqa+E>%khuS6n>>hS4ObkXh7IJkJ&b#7Twd zmXiS2W2;Km%f%zZOv(4VVb{Y4h7TXuL`x>!@>Fa?Rnj_^gHw%3hgBF`A>9e#pq(aZVtEjzrEXzj)T;Wa4d`-k`+$uj zHPNiD;dOTX3j-YosjqG^njxgzJMmdp*@yV7S{R^17XrB?z+_ zxPOT!{kUR`h^F@O*gNG7bPFFV^zyghRL757 zLCI;+ValyD4lr{vUmuODrm=i@z0`ZbiC|Nj!)%o5Iz@lglP6~^6N<-Vs{CAFd#auD zpJ_$`{35E6yp|$_bQDHEoA{UgrvwLEM2$2`Aow@RgxAVL|12ijBwbjS~eO1F!(;L_aC8|U0OhKpu2Lcos%eI# zPJ(#EtQh!4W9^7MO*G&Aw!Mx#t=?-wSM!AM!`HT^(!7XgS8=zr@3H?nekGUViFt%e zRm$k+qAd=0^SgWP<9iYOyPNx$k>tkfqh z7cF#MN$%Zhb z@L5}98B!_ul}C_vb!3cNwI$dd_agee@VMZ7G!hqxdp;EbPowb`QI^RNVgV_mO^$p* zXMiS0mTRv6G`^~?8|SObciWWH-u5Q1p`<_W4eG*ATNO<|R+T*2>l*E64@4_y*Td$W zWJ5m>Y#XhUv~&L^ocqt=-3{nCl2SQ{^nmapOsfVSS&Aw~($8nKpgiqRS3JyhSQO7^ z1(c-<7>aAUR4)AP{qa=al2BvB07(we<}nP=?O+90G;z}%+XboJE|mH7l=B~)AVQa6 zY#uo1nl52IK2x~n61<24r|yql$K09-=@+JA#3};JOm&~iS05hV4Z)2R^QbI zAjlSVRnvv<3qR)je}Ru+T{Xbt00L3De-5EB*yf_CNXoubU7Nzj`lCyg$47N| z(H%@@b&Mx*jw2sHspq8=>Eg*07#qD`#D`oHH8=Yp%DUzoHUf$BpOU2#{}OIUxZz9z1K-Wc6U6Oieyq3qIEucb<0Q*8CB z-<0#Kcz;Uswz0_1*op;^ZQ_KRlZf`V$FX5Lu@igQ{f_67yc2RAqLXw`K};k9C={zD zRh|@Z!5a|!^AzSRJomy)n0if0UJIVczFVDHAiEl~UyT89@o;swOEhRXHFsa%W28c- z0P%z@StD}$-9>p!)I(cb_oc3m>vdOVW=(TL3pAI#j&w>PH93hjUh(vKjR$f_}# z8nZ|)YOAg33F^S6%}`c3+CjWMF8a}i(F%6?#MxotpAYs%*k1yX&)x_m2V~}p_91fM zQ~DVyd)u@)bpZhSTLcMqUhHiGf%peQUgNhi{3RcMYlE@aMM{8NGd*=EoK*f9z^0WI z>_En0tEAhIhpDiRX>qau5coOV`>X{0LrHEw#7p|t6c~5L=5EAh&Ur)T(CRc^Hvk-N=*k^d5-1AI(BqUGI_rvlZgar zMMh$eZU;50&hf-gpRXYms}F(6=O(~T(iBI$G|fV0_b=@euVo#KWV;{hxEXE`Z2`U{qoH&0cBp4FgyaBy8m2K) zh2ubpUHaRjbnYOj{t8;u(bakY+kd zC8-K?nT-A!<>%$k?Res1xaeu6jn}C-d*rcKd-B29HQ+*)II6_HB+cOqxvcevV4L{K z;kCI`H7C_h;}?BBL)g z&5EWaD{hhD!4%wtiS?Z8S%S@+?oA@@Vv_Z^YK?rYjx31!h~`%h?N!%=Pz% z48Rn=E0oE3OSpc&02X6ngTygF>}$Xf8ix`KJ4Vfzy;VTq)|gdHq?y5HdQVUl7$D2q zq01AN^<9yBqrCy}-0KO}zcrpRKQ*zYBFRP&sst7&@)Mq5nMja>hBH9?i0kxAeKe=M zJF202j>Qe_blNFYmYQ;&AeNZEP=)&g@}-u3I<4w&O>#Y)k`Lb-I)bHZM*}U zQ{;n>>=>d<2famxRFhr2C@=I=_0KmyHLLN>y!t?z1I^=#t?Q+R+(ObakP6TWO}*`= zyq#Sn*tG|UNfJwGxJf`87|-s_yfs$_$esp-*m4Y^*MUJ_4?F)gOc^BN*;5AV^n z0FXhb=klI0K#zFFY6z|`!kFx+*#yg`B6t9W`+A588>OZ5YSo5tscT(rU5q5xX|H2Tk$ zMbcG<5MnMtg^oRx{gO*5$9mM2>N-Z6xeoJG-M{{94ni_kq)L^2HI2iZqLNjkG2+%M zNpJ}Qrs$Jf++M^y@?Pch?h9=VXGO!4f*zIsHVFx&9q*+Z?+^jN)+P9l<##=J6FRO# z86ug|PUuh)53)3w$>r!?Ry@3wAio|%Q-%8(PpmqG4Xk_jo-QH0N);7U1G!W$`F=S` z4RS0|!zSF#b{+27F+on?x=QOYYrop=81cKehm;pddG|Nz?jU5hCcYi0Sd4u<`uv%$ ziYo7?ih~j1lXvo!EUTXZ=GcXQ*~a=iD&0TZUjP2z%Yb&}m6(X)hj?o-x1j)-y%q8t zDWEAneF_tLq)l9n?D(qQG1@h^xWQXNUUE}tio?m$!UESW`BMqLPl$=WWA1Khz3o8h z-}Un>bkXxxZ`JRoY;6)3pI{GT1eYN!7y)=-^WI5_Yd`Jc=jP8gc|Lp>3l&1Y*(XmX zJMi;aR=x)aRNmW{UhtjC5=#Xt;qIG%R9OH2x}3Y3rpVAdw`AkbINUUTf%mY2w=GUs z?5zy8&Rz6Pido&DImRwRKh>5IAu-@BX{sOqjjoo_E&C7h$U1bO zEd%!AtOI~zbmQje{kb?O74SB8PYlqz%4mJSaPbB>x`h5;x*k&H9*{<7g3xb3Dm)pW z%Mg+agnpCgRw}n|N{Bk(ptAzTMExqz4XcpuwA&0&7UV0IYUP03s7@q`IOH-wPk~|T zHP0GgoBrUT2?Gbo8n$vV^g(JC&HMQmT1oc4UYa{{ z<^%&Yud{y^yQu?=8h3z$pCd5@Y!zJw*@v2e(&S39yLS2%R6Eb!3EB|`D8he~0g`k3 zA37iVe^KRP6#I&L`@xG=`@yX#)!Q|1J4j>rrZtU#qC=AK2WqG5M6Yz-u^k@gkkvKx z|D8?~&)+P(^EmlAdh}uX{_x-~;0NBlYNpEv`j1E!UUv>|Lbf;A>G4LD7HHG$3ji(S zJ9tl7hB+Wc=HsD%A#qt_=j98Kqb&e|;_Zq@q~h)o59l@tyLVPS{U7c+{f(w zqGRqcK>Y=l9@Pc(&)~h?=M0cuF37uImyb!mt^Q5AYLxPkZz;CMcJ61dwk}BBeU0*# zTS_~qMBKnuNWd%iFX@VF8shqkRg50h6zh>NQ}loA0?s`)w)j4r;QdZFV!Q zCQiXsiBpxnDL*ylwB*`z4x&q(Gnau5cIu6M?+eJR=mw^9A6>8VX=p_V-}9FL&O5A8?sJwaQaGmF6L8{gpN} z9>k1YG3c3bsb8ulqt@_(@e1h33`_Xw5ls>LaX;hx^->S!e{wu>UD|(3+$nUjQ%ez; zy3%1^);qmW07DNLrEe|<7im1PY$1J@^BpWPH^c0^y$|+vB&zxMmo{jmCjurQQP5y; zU9lAH2_ee4HYMOpcz1}8zeaIi{&G0(^$i|zr^2iip#;ymL1m3lPm`L)%1pT;SxqcecOb;|lo2{P)c`$&^jCJLI!!0|x_WI*h>%I5Rgr-MQH*e-C!uZlm zn;4*A2l>$A3FCJmo$=}SH@=z2HsAIAFf~$Q=SYf5K_hxBKOPJ^#>kY;wO)JxG^lD| zFoyzz>?fy!LV)x2m!Sb9;}r2JTuIi5(#I3a06D>^GRT-Pb(%RTGckV^e*|$~FnSFw zS7K#CN+~9LgaN?M4iYvM=qqG|3}BYzZi*bf|4M71hq6d@^7#l)Gp`?2mIp$30)2Q7 z{6sKYc8;+p5FO;RI-`*<5p>E`|Il5_#06N!b8|R51qwS9_ALn^S3{QHZtTsTS~f0o zCmkfMu)Q~6ZS$ z0pne?>Y?rUOO##G(K@nc3x>PAhCIBOH76(fLFZOoVsm|d<;KU_n5j%dk;zAKjfFSb zf=;Vc8hkQ{OKW7>_eaQ6QFA7cYyAjAt#(QoCFM)1*O|SM?p}_%+>(PCOm_BnF%HCe$d{zF?7DnFA^Jj=SxH8fV;Vh&FqDn zB0mm&L$os`IC;!%DUPY&Z<0(~nvTx3#ru1a@HWF}n|FQ;kjzRE(ldXeN@pjpOGf$7 z1Rb$!{dFp(PR;jh%}#0K`tMcT2zI%__DL0`VsxQ!f6GCA&oAAIh$mHA_oIL4L3r(3 z^M0w{*rSbF*(x7Ysiyl0DNWlnzABvl+K{Yd`_5|VR+!6=gFs5^06+p9ujz2qCfVb0 zsdVtb`tP-+#=+lSM3_rWjk`tickAzzwd(}yXnhvqlOeckD}*XJl1A#CS&D1qcl9B4 zjNseEPc)EH5}H0EuG9=R>Ylummnwy6jF}TG=99fw{#DXta&i-DjJQg@hf$+~OW^V_ z*7Q}8lY24^$6&`ePPrj^6(9e+^r0aV;NhdMjot?H!?o4CfMJa1<~q7+ z^~;Wxk!y!dK=;WP_nd^yLxU$MB&wD4GylZnQ*eNqVN5z0{_y#;@(1yKqxwPIZ;P1m zh3dLUwEvRtuQ!O}ri0B=?QQufjg<+FZDH{pVu-u6^r6^^7g&RwlG^kW4Vrpu5JHSxh z%4Jq@BC%OpmD-gH2j8k7udd*JzEO@1S|mLz@_P76Sp0%Zs z!mfl(<9H&&jw7yNNU_t9Sej_IaZxi6@jtp^>umKpCssIJu}YsEcmHU!@z=GF6|`0f zEz>sB@lkuSB9R?77thm9`gLIn?oYc^G_L)|+qJf4)6seXU28M9fBD~)~6;bs%myUqGuS2qm?rl{*Oi?K7Dr<$+YvT9)o75-w)ur*gH9Jo)uRL;J=qNhq zkMTFV*n|eGkMMB7MB>7VdYV&V&FPrzLmh+GHYQI*zHyj;i~D-=n9u967?PJOrH#y= zxP}6z+#A8(iNM#;6H`y+SjosA;)gR=tR@<@TiwBL>%1$@nwDXxWq?`x0@Z>`%~;$8 z;{+-uf-(YwLi$SAoLz-~D#?9An~t@Nn$?ZWi)@w0JGCUvF1*BfCrmF8lSTk8d0eFq zpKPTB6VH!LpUvI&^DRcmJ22~Uj}%nndYJ>C)%)ae6%00V)wwT`c23IwN|(E|U)4gu zzQRr#G@$26~SN-~+*vrAdQEv0r}S&!E}BcsLV1p*o@OI)r#_Wv>xbI)UxQ{CuS|IK zn4D0_(us06im(}eGc~hVJY?QzUp3!g_(V=R&`Uf|H;6piQf=$MJ>lV{+!Vn8QS8u7 zIh*f(H#CE8oDE_-EO*Q|*ZL&?Dd*|1A#J{zAx#L3V^ndX&FTcMnPMWc@~|f97^3YR zOURsy1gmhMg6~(E^J>^*VV$Y%ZvwRKi|Vn?@AGkR~n<3Cjc-we&ISgiT9vUcO~d-ZIjm&&@l*l?PJk9S}2rf;6-gvGjK z&Q28s2WiGgkZ-7KeJ+uko}Bt||9Hrew=+qLyaWT5A3`s`X;y2fdY^JWbXXev6Mh49 zOw1h>xeOBWE4SV3=*#o4%a9Yctz793KYaG+b8vS=PFVinlxt~m*|2&2R;=afl`G#C z6PtO))jMYrUlMAopqvi2HoGkYGjI6M*+&wlTqlnX(e+2&?t(#rhZ=$%|wzk_z?4<$wQBg?;APT;ASWr4v-`u`2f9fA#i3y? z=!U=$c6AoHb<${(aQia*)c!~W(SE#1_+Xh zq;leEzUcgqT&T4W00^N0NYqzg&A{B7ala$uEs>2?8V>fzPc;_zTIsgI&+Pbavw|gn zdO6*ol2x1Qe}Wn77hI;&1Jic0b>F`r0$KV*53Qx%| zn~$mYuL8UMjjE$Mx}Ycczo{$8UsP4@>%V$(=P#9&_?Ig7yZrxc!9vHVPIqH09*$UE zRWGtB<(a=$1o=nw9;6eV0qR{q(GS%C9izlUhFSVQpb!85L<;_rzh6@37_x6gox4kQ z-&cW8w24TKj-kCI3^G>+kn)lnITqd3qpY{I4xfoAeeu)iqHieA^-ma&p^wyeWF7*n z!$GGNh)(%qd4S%{T-@rC^^14e)}rJ26%hqgu;m)MY{Et|eevp|M(voasL>qCipoL8 zK@u>6gWEEGVo!`>_H_o8b23+$C~EC%Y-W6y4&5jbxOf)CX`}u-k8cvTAh?m_4GGPh zu(NY;Tv0HT!89O}V4Kh^yczT|95T1l>19gEAnV13lCU~xQn1}*^CxHz;RxAFlj3II zQ|A}@O+kEdT5%fFC!Yt`?h{=4PE`fsJ@6qqAMN@`qcJJ618>>a=P4qPp@7aWPDd9r zKurl#DsIgwbFqFQoLZgf87?u$el4mECaO=QWi0duHVo&EtKznntB6amWuo&|C@Q;V z_^#DAUs~uvZq(Yx25ljCC4{MiZli{bL)fgd(zz%31zzAajNP%HkcG&BLMeCCWLvNh z*26SW-8Dj6Y=tgN)yZ>2dfJ^umyLIpcz7zmICM>PLcQygu#x~=>Rf(}$-=GIUkOUz z*8|;F3vIm$>%%;7)nzVASw|ciRChG&y70Oop07yivKEO}`z61DH>R?hQmF<>xnZ@A`ReT1Xiyaq4!Db|fAVXubBK_DvLr9!jD zsg82Sud}9l%J2uNLB%_4rz7LUZfuxv(#e=LbFKQxbLB4Iu^fRtf{XE8NRPLjtJri5fX z{gSS{z3`BSFLG{ebyI+vL5VrYeuQ*^9d%sBa&E0MKrio18-HF=DJq@Pf6V=m;loA5)WkL*g7SmQ8AN>vllb64X^d$*y!9o{kBlUjtHo)SymBgE`F z5k`p@$*Trr!Pc%uHByE?X2Ac5fwERmvcu4@JiSl1!q%W9t7?VU_+_4y#ECO@#*6Ko zT-CqJ$h~vAdBhB-*)hz?rQNaVHLlbVm)&)mBuANxIjF#2(< zF~RINZnp$H_bCM0rBdm;qc&16y@8xZdxiw(&|?7eO6DKA%;fLOlFOu)lW?7Lf~^j) z7To*M$L@RE+2i(x9^I8^t~AToSTk?4gjnh59(r@f()A_45tFJRkH%{{An?cOlFQm) z^7f=^*eTM;JDYY!=Td7`j(-}xUjIZ2g%xm{H=R8v*yoa2XCSX3(g7+E|!)IGE? z6tD#b2E^o-*i8p{ryQ)-`avu%t?^Xpz|;>H9a#C~`P0%Ss~uxME%*6)o2dEGvASUt ztFgZq{XfI8Tn4q3e1y&qX_*RX!#dIX=&cn=n`_gsl%+?)6Aj!o+O-g)Wx3bX-5HJb z7%*$2+3b{xv31#YiMpq8U|oQL#khfJchNCSj;wY^DN0d&5x4jD!3SME@3eMTn4LQ{ zBU7H7nK&bM)WptuwmBvW#ia&j^4F$o%_sg}1Y5*4SZ z=#=9zzR$hgQN&_7`hfuol(=98n5)V5WiJ7S%DTX`Tkvp4^vtRQv}I@giTgdwsoL5q zjNz#yLB)#|dJ%nwbp|mvXi9AZBrFdEsks0EHPKrdOVM)%5zrQeEIvohR}%q$Na z#_iSa$!Mr%*T-tdlA}7bq+78^CCFz{l3{1im?Y6qWxw&c6o0k6*AF5jk^|E=4Z2kY zaB7ld8+AyBnA3Ig19xD>jvtJ>WGZfyl18x|gxV-IKUX)}Xl9BYwy{SP=jwd;TFPyQ zV(lS6rv#IR0#pFgJ>Em0+#Oe%!TKvCx4gF6Z82K1%j&h#GeZsg0!gB#rE6RmFT8cm zKG2KcOqza12^C?0ZVeLsCYI4sA+fcM**@nht})$?uDjt8XZp77%U5&XJBjL{Cu^oh zb^?N{e}5<&bScOwdLVty_j!O%Y`@zCES*@?E;C+KTT?h(B>rp;7LzGT^~srnde$$d z<>JOCV(ZdFBFtY4;K1I#*I;jssc9bdG;Yn58f?7($!^8=R+dYldyOaNNRiqI{H*=! z6n`me=i{$JtP)qT?3(^$fr+*gp2w)B`b`*8gPWy~&5EjEzwnF92R#z#M%~-V;f2L_ zxfUv)t%;vRnb-Hr&kvV8D)v8X-^==8(BYb>GpXXTPbHUAQtZ~c%~0OqW}B()Q7?xk znCGs)`h~G{w1=mtUiWCMNt0p`?g#FN!|%+v23;R6ab-`=3~TyPJPpzt4c{=f_l{>kQCd zpnwJY0Yzs8TszV1eIV#TM*x%?k}Q@w1@bhrflLSjUg#3wg+2o~D;>Y+V_3j1)PT@9 zVRY52B14v@ly<-i-5m$K&^t(SJ)~L@@IZe89_XPA1}MId4gJ5f7%0Qx&zOcx;g1Od z5yzViZ$5i2AU1>y-2QlE>mT%h1%4DEahD}=j|#+!^`+b_kui{YUdSqe=iuZUfZl%l z7AuI)N{pm27m!TeZ#F6Y)wd!rQWPj(mJ%Y;d6Dy4g1y{@jm79s>6hNWU5tB`lOhH< z%nVRizWPKpDj@EkrpC`*XWB(CDHY~-NzO0<50glw%l<-fV}w>5FASBox~V%Pd+?e* z(qw>CPBlD>QwU7`Hjz-r=T|Gn&;N}kMNKY7=vOpm00cC`I;g3#u>EM0Pww}fd*Q~? zV=#rgtQ|);qFz4@>NL~Ng?R?TVDfDjd;P3+M6X!A&F}FNyTvXo#>#U|7HaMxr(i0y zysD5{Zm3LHNmH`bk^fMYc01=~#iiW}z2aB-8y^AH^~XVnK>TBEfi_ zo!$l!L^~)g8f)p8k^+jfs+QyXzEvls+|QiZ)aCC1h9KfxFAn#C-F^Z3<0 zY04w2+{_d+q0n>B>gYzCNX1;@v>Z%{KZlhCo%>z#?r;LO+GR0{mf9&qakAV;`i zUlOv%5P=QK%jz{Zx%+%GW0$@Ty|cMQ=iDYowE+Z0@Y*Ulu!VkNqzpR?CanWcs^Cva zsK%3C-8kJ?(~wG-HYM_C{_yVQgGV~_f4o{)*l4j%m5@(O+qb9pf;qN(UrvjXkTGa( z!8Xk4SYtu)lV1|>1_lIl3h&6_S?iKv=iQdJ7-qy+?`1Qah3U<9HP4473nj{VUFc0| zu}`gbMJY7kIW*Ww%-pZuNa$frX;MZjio>b}BS>10v@$1uZjzrFs2Y0|F_;^P7P*{h zTe^{7`0@ShRpw{*Tv*mdSyD1kBiLxfrH{*dJTDvdNiYlbjsh2Oa!7G`d3mz`Q0r3d zz43DcsV#uvYLuEAqlwOd zqo%=?wPa|xyuu?dntWb{=$N;{P4iBzhU@p=83f#u)Z;iiF8C;>7^2$e`+U5PbXf!&`&tUE*-GsEL!2@~ s?JCv|e2O_2|2IsajBEzzTks~mX%=`M46rH#H1h8SrvHuWnHl5%2TTYxs{jB1 literal 0 HcmV?d00001 diff --git a/docs/assets/images/magento-marketplace-my-profile-link.jpg b/docs/assets/images/magento-marketplace-my-profile-link.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ffc35b4d8462819ca8e7639079de9212f2bf8b48 GIT binary patch literal 20019 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/magento-marketplace-signin-form.jpg b/docs/assets/images/magento-marketplace-signin-form.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4f61f6dda3284d85cee3eec5e943182fbb2835e GIT binary patch literal 26312 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 literal 0 HcmV?d00001 diff --git a/docs/guide/creating-a-store.md b/docs/guide/creating-a-store.md index c035aa121..a60455d6f 100644 --- a/docs/guide/creating-a-store.md +++ b/docs/guide/creating-a-store.md @@ -1,60 +1,107 @@ -# Creating a new store +# Creating a Store + +In this guide we explain step-by-step how you can create a store with Vue Storefront 2 and Magento 2. + +> ℹ️ We're gonna use `my-store` as the project name and the folder structure below as its initial structure for this guide. +> +> ``` +> ./ +> ├─ my-store/ +> │ ├─ client/ +> │ │ ├─ … +> │ ├─ server/ +> │ │ ├─ … +> ``` +> +> So be sure to create the `my-store` folder.. +> +> ```sh +> mkdir my-store +> cd my-store +> ``` -To create a new Vue Storefront Magento 2 store, there are two available options: +## Requirements -1. [Using the Vue Storefront CLI](#using-the-vue-storefront-cli) -2. [Cloning the template store](#cloning-the-template-store) +- NodeJS version 16+ +- Docker Desktop + - It's only required to setup Magento 2 locally +- Magento Marketplace account + - You can use your account of create a new one in [here](https://account.magento.com/customer/account/create/) -## Requirements +## Creating the Magento 2 store -- Node.Js 16+ -- Magento 2.4.3+ instance for GraphQL endpoint -- Change Magento GraphQL Query Complexity and Depth values +We're going to create the Magento 2 store inside `server` folder to let explicit that we're just using it as backend layer for our store. -::: warning Don't forget to change the Magento GraphQL Query Complexity and Depth values -Magento 2 by default has a lower value for the complexity of 300, and a higher value for the depth of 20. [Magento 2 - Issue #32427](https://github.com/magento/magento2/issues/32427#issuecomment-860478483) +```sh +mkdir server +cd server +``` -The changes are required, due to the size of the queries and mutations in the `api-client` implementation. +### Getting access keys for Magento -To do this changes, you can use the [Magento 2 module](https://github.com/caravelx/module-graphql-config), which adds a configuration panel to your admin, or do this changes manually. -::: +Magento and other third-party packages used by Composer are stored in a repository that requires authentication. So in order to install Magento we'll need to generate access keys in the Magento Marketplace. **That's why the Magento Marketplace account is a requirement.** -To install the Magento 2 GraphQL Config module, on your Magento installation execute: +[Sign in](https://account.magento.com/customer/account/login) into Magento Marketplace, open your profile in the Marketplace and create a new access key on "Access Keys" page. -```bash -composer require caravelx/module-graphql-config +![Magento Marketplace generated access keys](../assets/images/magento-marketplace-access-keys.jpg) -php bin/magento module:enable Caravel_GraphQlConfig +> ℹ️ In Magento's Dev Docs you can get more information about authentication keys. +> +> -php bin/magento setup:upgrade +
+ 🧵 Here's a step-by-step version of how to create access keys -php bin/magento setup:di:compile +1. [Sign in](https://account.magento.com/customer/account/login) into Magento Marketplace; -php bin/magento setup:static-content:deploy -``` + ![Magento Marketplace sign-in form](../assets/images/magento-marketplace-signin-form.jpg) -Find more information about the module [GraphQl Custom Config](https://github.com/caravelx/module-graphql-config) +2. In your Magento Account page, click in the "Marketplace" tab; -## Using the Vue Storefront CLI + ![Magento Marketplace link](../assets/images/magento-marketplace-link.jpg) -To create a new store using the Vue Storefront CLI, first you need to install the CLI +3. In your user's menu, click in the "My Profile" item; -```bash -npm i -g @vue-storefront/cli -``` + ![Magento Marketplace link](../assets/images/magento-marketplace-my-profile-link.jpg) + +4. Click in the "Access Keys" link; + + ![Magento Marketplace Access Keys link](../assets/images/magento-marketplace-access-keys-link.jpg) + +5. Click in the "Create a new access key" button; + + ![Magento Marketplace create access key button](../assets/images/magento-marketplace-create-access-key-button.jpg) -Then you must create the new store using the newly installed CLI +6. Type in a name for these access keys and click in the "OK" button; -```bash -vsf init -# And choose Magento 2 + ![Magento Marketplace create access key button](../assets/images/magento-marketplace-access-key-form.jpg) + +
+ +### Setting up the Magento 2 store + +To reduce the complexity we're will use the one-line setup command of [`markshust/docker-magento`](https://github.com/markshust/docker-magento). So you just have to run the command below to create the store. After running it will ask for the Username and Password, use your public access key as username and your private access key as password. + +```sh +curl -s https://raw.githubusercontent.com/markshust/docker-magento/master/lib/onelinesetup | bash -s -- magento.test 2.4.4 ``` -## Cloning the template store +Here's a recording of these steps: + + -To create a new store cloning the template store, you need to clone the Magento base template store. +## Creating the Vue Storefront for Magento 2 -```bash -git clone https://github.com/vuestorefront/template-magento +That's the easy part, you just need to execute the `init` command of Vue Storefront CLI in the project root folder. It will ask you for the project name and the integration. Keep in mind that the project name will also be used as the project folder name, and be sure to select the Magento 2 integration. + +```sh +npx @vue-storefront/cli init ``` +Here's a recording of these steps: + + + +## How to start if you want to contribute? + +Want to contribute? Ping us on `magento2-vsf2` channel on [our Discord](https://discord.vuestorefront.io)! From 8a5b5a2fadee536a652f8a1f790d0e857471427f Mon Sep 17 00:00:00 2001 From: Vitor Luiz Cavalcanti Date: Tue, 10 May 2022 03:37:05 -0300 Subject: [PATCH 368/486] docs: add more sections to Creating a Store --- docs/guide/creating-a-store.md | 81 ++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/docs/guide/creating-a-store.md b/docs/guide/creating-a-store.md index a60455d6f..5f387df34 100644 --- a/docs/guide/creating-a-store.md +++ b/docs/guide/creating-a-store.md @@ -90,6 +90,87 @@ Here's a recording of these steps: +### Setting up the authentication + +In the Magento 2 folder, copy the `src/auth.json.sample` file to `src/auth.json`. + +```sh +cp src/auth.json.sample src/auth.json +``` + +Update the username and password values with your Magento public and private keys, respectively. + +```json +{ + "http-basic": { + "repo.magento.com": { + "username": "a1c69cb…", + "password": "af041560…" + } + } +} +``` + +Finally, copy the file to the container by running `bin/copytocontainer auth.json`. + +```sh +bin/copytocontainer auth.json +``` + +### Populating with sample data + +In the Magento 2 folder, execute the the commands below to add deploy sample data to your store. + +```sh +bin/magento sampledata:deploy +``` + +And make sure the configuration was correctly registered. + +```sh +bin/magento setup:upgrade +``` + +### Enabling CORS + +In order to accept requests from other domains, e.g. `magento.dev`, you may need to enable CORS origins in your Magento store. + +In the Magento 2 folder, add the package `graycore/magento2-cors` by running the command below. + +```sh +bin/composer require graycore/magento2-cors +``` + +Add the following configuration at the end of `src/app/etc/env.php`. + +```php + 'system' => [ + 'default' => [ + 'web' => [ + 'graphql' => [ + 'cors_max_age' => 86400, + 'cors_allow_credentials' => 0, + 'cors_allowed_methods' => 'POST, OPTIONS, GET', + 'cors_allowed_headers' => 'Content-Currency, Store, X-Magento-Cache-Id, X-Captcha, Content-Type, Authorization, DNT, TE', + 'cors_allowed_origins' => '*' + ] + ] + ] + ] +``` + +Enable the graycore cors. + +```sh +bin/magento module:enable Graycore_Cors +``` + +Make sure the configuration was correctly registered. + +```sh +bin/magento setup:upgrade +``` + ## Creating the Vue Storefront for Magento 2 That's the easy part, you just need to execute the `init` command of Vue Storefront CLI in the project root folder. It will ask you for the project name and the integration. Keep in mind that the project name will also be used as the project folder name, and be sure to select the Magento 2 integration. From d3c4024933fef76e8654422ad484f269a694a406 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 13 May 2022 11:38:54 +0200 Subject: [PATCH 369/486] docs: update the 'Configuring Magento' and 'Configuring Vue Storefront' documents --- docs/.vuepress/config.js | 21 +- docs/getting-started/configure-integration.md | 158 +++++++++++++++ docs/getting-started/configure-magento.md | 120 +++++++++++ docs/guide/about.md | 6 +- docs/guide/configuration.md | 166 ---------------- docs/guide/creating-a-store.md | 188 ------------------ docs/guide/roadmap.md | 32 --- docs/guide/supported-features.md | 2 +- 8 files changed, 290 insertions(+), 403 deletions(-) create mode 100644 docs/getting-started/configure-integration.md create mode 100644 docs/getting-started/configure-magento.md delete mode 100644 docs/guide/configuration.md delete mode 100644 docs/guide/creating-a-store.md delete mode 100644 docs/guide/roadmap.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 6c2542e83..72d1a7396 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -46,10 +46,6 @@ module.exports = { nav: [ { text: 'Vue Storefront', link: 'https://vuestorefront.io/' }, { text: 'Core Documentation', link: 'https://docs.vuestorefront.io/v2/' }, - { text: 'Demo', link: 'https://demo-magento2.europe-west1.gcp.storefrontcloud.io/' }, - { text: 'GitHub', link: 'https://github.com/vuestorefront/magento2' }, - { text: 'Roadmap', link: 'https://docs.vuestorefront.io/magento/guide/roadmap.html' }, - { text: 'Environments', link: 'https://docs.vuestorefront.io/magento/guide/environments.html' }, ], sidebar: [ { @@ -60,26 +56,23 @@ module.exports = { ['/guide/environments', 'Demo environments'], ['/guide/supported-features', 'Supported features'], ['/guide/about', 'About'], - ['/guide/roadmap', 'Roadmap'], ], }, { - title: 'Creating a Storefront', + title: 'Getting started', collapsable: false, children: [ - ['/guide/creating-a-store', 'Creating a Store'], - ['/guide/configuration', 'Configuration'], - ['/guide/override-queries', 'Override queries'], - ['/guide/testing', 'Testing'], - ['/guide/recaptcha', 'ReCaptcha'], + ['/getting-started/configure-magento', 'Configuring Magento'], + ['/getting-started/configure-integration', 'Configuring Vue Storefront'], ], }, { - title: 'Performance', + title: 'Guides', collapsable: false, children: [ - ['/guide/graphql-get', 'Varnish & GET for GraphQL Queries'], - ['/guide/ssr', 'Server Side Rendering Cache'], + ['/guide/override-queries', 'Override queries'], + ['/guide/testing', 'Testing'], + ['/guide/recaptcha', 'ReCaptcha'], ], }, { diff --git a/docs/getting-started/configure-integration.md b/docs/getting-started/configure-integration.md new file mode 100644 index 000000000..a83018607 --- /dev/null +++ b/docs/getting-started/configure-integration.md @@ -0,0 +1,158 @@ +# Configuring Vue Storefront for Magento 2 + +This guide explains the steps needed to install and set up Vue Storefront for Magento 2. + +## Prerequisites + +Before you can get started, you need the following: + +- **Node.js 16** installed, +- Magento 2 server configured following the [Configuring Magento store](/getting-started/configure-magento.html) guide. + +## Creating the Vue Storefront for Magento 2 + +To install Vue Storefront, run the command below. It will ask you for the project name and the integration of your choice. Keep in mind that the project name will also be used as the folder name, and be sure to select the Magento 2 integration. + +```sh +npx @vue-storefront/cli init +``` + +Here's a recording of these steps: + + + +## Setting environment variables + +After installation, the first step is to configure the integration using the environment variables. + +1. Go to the root folder of your project. +2. Make a copy of the `.env.example` file and rename it to `.env`. You can do it manually or use the following command: + + ```sh + cp .env.example .env + ``` + +3. Update values in the `.env` file. + +## Populating store configuration + +The `plugins/storeConfigPlugin.ts` plugin loads store configuration data from Magento and saves it into the Pinia store under the `$state.storeConfig` property. By default, the amount of data loaded from Magento is minimal to avoid over-fetching, but as your application grows, you might need to pull more data. + +This plugin loads the store configuration data based on a query in the `plugins/query/StoreConfig.gql.ts` file. You can modify this file to change what data is loaded. + +## Configuring multistore and localization + +Each Magento store view needs a corresponding locale configuration object in the `i18n` object in the `nuxt.config.js` file. + +### `i18n.locales` + +The `i18n.locales` array contains all supported locales. Each item in this array is an object containing the following properties: + +- `code` - unique identifier of the locale corresponding to Magento store view code. +- `file` - the name of the file containing translations for this locale in the `lang` folder. +- `iso` - corresponding ISO country code. + +For other properties please follow official [nuxt-i18n documentation](https://i18n.nuxtjs.org/options-reference#locales). + +In the example configuration below, you need to have two Magento store views with corresponding store codes: `default` and `german`. + +```json +locales: [ + { + code: 'default', + file: 'en.js', + iso: 'en_US', + }, + { + code: 'german', + file: 'de.js', + iso: 'de_DE', + } +] +``` + +### Translations + +When working with translation in your application, you need to: + +1. Add translations in Magento for products and categories. +2. Update the `i18n.locales` array in the `nuxt.config.js` file and add translations to the corresponding files in the `lang` directory. + +## Optimizing images + +You can use external image providers to optimize your images thanks to the [nuxt-img](https://image.nuxtjs.org/) module. + +By default, Vue Storefront uses the `ipx` provider, an open-source, self-hosted image optimizer. + +### Configuring external image provider + +If you decide to use an external image provider, you have to update the following environment variables inside the `.env` file: + +1. `VSF_MAGENTO_BASE_URL` - base URL of Magento shop. The `useImage` composable uses it to extract the image path from the full Magento URL. +2. `VSF_IMAGE_PROVIDER` - name of the external provider, e.g. `cloudinary`. See the [Providers](https://image.nuxtjs.org/getting-started/providers) page for more information. +3. `VSF_IMAGE_PROVIDER_DOMAIN` - domain of the image provider. +4. `VSF_IMAGE_PROVIDER_BASE_URL` - base URL of the image provider to upload images. + +See the `image` property in the `nuxt.config.js` to learn how these environment variables are used and to configure any [other options](https://image.nuxtjs.org/api/options) supported by the [nuxt-img](https://image.nuxtjs.org/) plugin. + +### Synchronize Magento images with an external provider + +You need to synchronize all your images from the two folders below manually or create a script to do so: + +- `media` folder in Magento. We recommend using the same path as in Magento. For example, if your image path is `{MAGENTO_BASE_URL}/media/catalog/product/{IMAGE_PATH}`, you should have the corresponding image in your external provider with the same path, e.g. `media/catalog/product/{IMAGE_PATH}`. +- `static` folder in Vue Storefront. + +### The `useImage()` composable + +Magento GraphQL API returns an URL to cached images, e.g. `{MAGENTO_BASE_URL}/media/catalog/product/cache/{IMAGE_PATH}`. When you download all images from your server's `media` directory, paths don't include the `cache/***/` part. + +Because of that, we created the `useImage()` hook, which provides the `getMagentoImage(fullImageUrl: string)` method. This method returns an URL to the image without the Magento base URL and cache part. You can use it to get images from external providers. + +Here's an example of how to use the `useImage()` composable: + +```vue + + + +``` + +### ImageSizes enum + +There is a helper object in the `enums/imageEnums.js` file that export configuration for various image types: + +```javascript +module.exports = { + productCard: { + width: 216, + height: 268, + }, + productCardHorizontal: { + width: 140, + height: 200, + }, + cartItem: { + width: 100, + height: 100, + }, +}; +``` diff --git a/docs/getting-started/configure-magento.md b/docs/getting-started/configure-magento.md new file mode 100644 index 000000000..83ae6bac6 --- /dev/null +++ b/docs/getting-started/configure-magento.md @@ -0,0 +1,120 @@ +# Configuring Magento store + +This guide explains the step needed to install and set up Magento 2 store for Vue Storefront. + +## Prerequisites + +Before you can get started, you need the following: + +- **Docker Desktop** to setup Magento 2 locally, +- **Magento Marketplace account** to download Magento 2. To create it, visit [this page](https://account.magento.com/customer/account/create/). + +## Creating the Magento 2 store + +We're going to install Magento 2 inside the `server` folder. Run the following commands to create a `server` folder first: + +```sh +mkdir server +cd server +``` + +### Getting access keys for Magento + +Registry that stores Magento and other third-party packages requires authentication. You'll need to generate access keys in the Magento Marketplace to install them. + +Follow the [Get your authentication keys](https://devdocs.magento.com/guides/v2.4/install-gde/prereq/connect-auth.html) guide to generate new access keys. + +![Access keys generated in Magento Marketplace](../assets/images/magento-marketplace-access-keys.jpg) + +### Setting up the Magento 2 store + +To simplify the setup, let's use the [`markshust/docker-magento`](https://github.com/markshust/docker-magento) script. + +Run the command below to create the store. It will ask you for the Username and Password. Use your public access key as a username and your private access key as a password from the previous step. + +```sh +curl -s https://raw.githubusercontent.com/markshust/docker-magento/master/lib/onelinesetup | bash -s -- magento.test 2.4.4 +``` + +Here's a recording of these steps: + + + +### Setting up the authentication + +In the Magento 2 folder, copy the `src/auth.json.sample` file and rename it to `src/auth.json`. You can do it manually or use the following command: + +```sh +cp src/auth.json.sample src/auth.json +``` + +Update the username and password values with your Magento public and private keys. + +```json +{ + "http-basic": { + "repo.magento.com": { + "username": "a1c69cb…", + "password": "af041560…" + } + } +} +``` + +Finally, copy the file to the container by running the following command: + +```sh +bin/copytocontainer auth.json +``` + +### Populating with sample data + +In the Magento 2 folder, execute the commands below to add sample data to your store. + +```sh +bin/magento sampledata:deploy +``` + +Then update the configuration: + +```sh +bin/magento setup:upgrade +``` + +### Enabling CORS + +You may need to enable CORS origins in your Magento store to accept requests from other domains, e.g., `magento.dev`. In the Magento 2 folder, add the package `graycore/magento2-cors` by running the command below: + +```sh +bin/composer require graycore/magento2-cors +``` + +Then, add the following configuration at the end of `src/app/etc/env.php`: + +```php + 'system' => [ + 'default' => [ + 'web' => [ + 'graphql' => [ + 'cors_max_age' => 86400, + 'cors_allow_credentials' => 0, + 'cors_allowed_methods' => 'POST, OPTIONS, GET', + 'cors_allowed_headers' => 'Content-Currency, Store, X-Magento-Cache-Id, X-Captcha, Content-Type, Authorization, DNT, TE', + 'cors_allowed_origins' => '*' + ] + ] + ] + ] +``` + +Enable the graycore cors. + +```sh +bin/magento module:enable Graycore_Cors +``` + +Then update the configuration: + +```sh +bin/magento setup:upgrade +``` diff --git a/docs/guide/about.md b/docs/guide/about.md index abf9b9115..44de0c09e 100644 --- a/docs/guide/about.md +++ b/docs/guide/about.md @@ -2,8 +2,9 @@ ## Resources -- [Vue Storefront Documentation](https://docs.vuestorefront.io/v2/) -- [Magento 2 integration Documentation (WIP)](https://docs.vuestorefront.io/magento) +- [GitHub repository](https://github.com/vuestorefront/magento2/) +- [Vue Storefront website](https://www.vuestorefront.io/) +- [Core Documentation](https://docs.vuestorefront.io/v2/) - [Community Chat](https://discord.vuestorefront.io) ## Support @@ -13,6 +14,7 @@ If you have any questions about this integration we will be happy to answer them ## Contributors ✨ ### Honorable Mentions + - [Cyberfuze](https://cyberfuze.com/) - [Leonex](https://www.leonex.de/) diff --git a/docs/guide/configuration.md b/docs/guide/configuration.md deleted file mode 100644 index 88023878e..000000000 --- a/docs/guide/configuration.md +++ /dev/null @@ -1,166 +0,0 @@ -# Configuration the Magento Integration - -After the creation of the store, you must configure the Magento integration. You can configure the integration using the `environment variables` or using a `configuration file`. - -## Environment Variables - -For configure the integration using `environment variables`, you can have a `.env` file in the root folder, or define those in the server `environment`. - -```dotenv -# Example environment configuration -STORE_ENV=dev # Store environment (Usage for file configuration) -NUXT_APP_ENV=development # Define nuxt application environment -NUXT_APP_PORT=3000 # Define nuxt port -MAGENTO_GRAPHQL_URL=https://{YOUR_SITE_FRONT_URL}/graphql # Define Magento GraphQL endpoint -MAGENTO_EXTERNAL_CHECKOUT_ENABLED=false # Flag if VSF will use External Checkout -MAGENTO_EXTERNAL_CHECKOUT_URL=https://{YOUR_SITE_FRONT_URL} # External checkout URL -MAGENTO_EXTERNAL_CHECKOUT_SYNC_PATH=/vue/cart/sync # External Checkout synchronization path -MAGENTO_BASE_URL={YOUR_SITE_FRONT_URL} # base url of your Magento instance -IMAGE_PROVIDER={YOUR_IMAGE_PROVIDER} # your image provider, for example cloudinary, default is ipx -IMAGE_PROVIDER_BASE_URL={YOUR_IMAGE_PROVIDER_BASE_URL} # base url provided from your image provider. It's used by nuxt-img to fetch images -``` - -## Configuration file - -To use the configuration file in your application, first you need to define an `environment variables` called `STORE_ENV` which will be used to attribute what file the application will use to load the configuration from. You can create an `.env` file and add the following configuration. - -```dotenv -# .env file example -STORE_ENV=dev # Store environment (Usage for file configuration) -``` - -Then on the `config` folder create a file `dev.json` with your configurations. - -```json5 -{ - "magentoGraphQl": "https://{YOUR_SITE_FRONT_URL}/graphql", // Define Magento GraphQL endpoint - "enableMagentoExternalCheckout": false, // Flag if VSF will use External Checkout - "externalCheckoutUrl": "https://{YOUR_SITE_FRONT_URL}", // External checkout URL - "externalCheckoutSyncPath": "/vue/cart/sync", // External Checkout synchronization path - "nuxtAppEnvironment": "development", // Define nuxt application environment - "nuxtAppPort": 3000, // Define nuxt port - "imageProvider": "ipx", // define image provider - "magentoBaseUrl": "https://magento2-instance.vuestorefront.io/", // define your Magento base URL - "imageProviderBaseUrl": "https://res-4.cloudinary.com/{YOUR_CLOUD_ID}/image/upload/" // define image provider base url - this is example from cloudinary -} -``` - - -## Store Config -This type contains information about the Magento's Store Configuration which is stored in Pinia `$state.storeConfig`. To avoid over fetch, by default, the amount of data pulled from Magento is minimal but as your application grows you might want to pull more config data for different purposes. - -Plugin `plugins/storeConfigPlugin.ts` is responsible for initial population of the Store Config data based on query in `plugins/query/StoreConfig.gql.ts`. To modify the initial Store Configuration state simply adjust the query to your needs. - -## Multistore and localization - -Each Magento Store View need to have corresponding locale configuration object in `i18n.locales` array in `nuxt.config.js`. - -### Locale configuration object reference - -`code` (required) - unique identifier of the locale - corresponding to Magento store view code -For other properties please follow official [nuxt-i18n docs](https://i18n.nuxtjs.org/options-reference#locales) - -### Sample configuration - -```json -locales: [ - { - code: 'default', - file: 'en.js', - iso: 'en_US', - }, - { - code: 'german', - file: 'de.js', - iso: 'de_DE', - }, -], - ``` -So for this configuration you need to have two Magento store views with corresponding store codes: `default` and `german` - -## Translations - -There are two steps to translate whole storefront: -1. Add translations in Magento for products and categories if necessary -2. Add translations to files in the `lang` directory - - -## Image Providers -Thanks to the [nuxt-img](https://image.nuxtjs.org/) you can use external image providers. - -By default, we use the `ipx` provider. that means the images are fetched from Magento, and from `static` directory. - -### How to configure external image provider - -1. Configure ENV variables - 1. `MAGENTO_BASE_URL` - base URL of Magento shop. It's used by the `useImage` composable to extract image's path from full Magento URL. - 2. `IMAGE_PROVIDER` - for example: `cloudinary`. List of available providers is [here](https://image.nuxtjs.org/getting-started/providers) - 3. `IMAGE_PROVIDER_BASE_URL` - the base url of your project in for example cloudinary or other image providers -2. Configure your provider in `nuxt.config.js`. Here is the example: -```javascript -image: { - provider: process.env.VSF_IMAGE_PROVIDER - magekit: { - baseURL: process.env.VSF_IMAGE_PROVIDER_BASE_URL - } -}, -``` -3. Sync your Magento images with external provider - 1. For example if you have anb image in Magento with path `{YOUR_MAGENTO_BASE_URL}o/media/catalog/product/w/g/wg02-bk-0.jpg` - you should have corresponding image in your external provider: `media/catalog/product/w/g/wg02-bk-0.jpg` -4. Sync your local images with external provider - 1. Upload content of `static` directory to your external media library - -### The useImage composable - -Magento GraphQL API returns an URL to cached images, for example: `https://magento2-instance.vuestorefront.io/media/catalog/product/cache/d3f55929541f2d022ca06067148d0eae/w/g/wg02-bk-0.jpg`. -When you basically download all images from your server (from media) directory, paths are different, they does not include `cache/***/` part. - -Because of that, we created the `useImage` hook, which provides `getMagentoImage(fullImageUrl: string)` method. -That methods returns an URL to image, without magento base url, and cache part. Then you can use it to get images from external providers. - - -When you want to use this composable you need to: - -1. import it in component - `import { useImage } from '~/composables';` -2. Export `getMagentoImage to a template -```javascript -// component body (typically a setup() function) -const { getMagentoImage } = useImage(); - -return { - ... // other things like computed properties, methods and so on - getMagentoImage -} -``` -3. Use the `getMagentoImage` method in template like this: -```vue - -``` - -### ImageSizes enum -There is helper object in `enums/imageEnums.js` file that export configuration for various image types: -```javascript -module.exports = { - productCard: { - width: 216, - height: 268, - }, - productCardHorizontal: { - width: 140, - height: 200, - }, - cartItem: { - width: 100, - height: 100, - }, -}; - -``` diff --git a/docs/guide/creating-a-store.md b/docs/guide/creating-a-store.md deleted file mode 100644 index 5f387df34..000000000 --- a/docs/guide/creating-a-store.md +++ /dev/null @@ -1,188 +0,0 @@ -# Creating a Store - -In this guide we explain step-by-step how you can create a store with Vue Storefront 2 and Magento 2. - -> ℹ️ We're gonna use `my-store` as the project name and the folder structure below as its initial structure for this guide. -> -> ``` -> ./ -> ├─ my-store/ -> │ ├─ client/ -> │ │ ├─ … -> │ ├─ server/ -> │ │ ├─ … -> ``` -> -> So be sure to create the `my-store` folder.. -> -> ```sh -> mkdir my-store -> cd my-store -> ``` - -## Requirements - -- NodeJS version 16+ -- Docker Desktop - - It's only required to setup Magento 2 locally -- Magento Marketplace account - - You can use your account of create a new one in [here](https://account.magento.com/customer/account/create/) - -## Creating the Magento 2 store - -We're going to create the Magento 2 store inside `server` folder to let explicit that we're just using it as backend layer for our store. - -```sh -mkdir server -cd server -``` - -### Getting access keys for Magento - -Magento and other third-party packages used by Composer are stored in a repository that requires authentication. So in order to install Magento we'll need to generate access keys in the Magento Marketplace. **That's why the Magento Marketplace account is a requirement.** - -[Sign in](https://account.magento.com/customer/account/login) into Magento Marketplace, open your profile in the Marketplace and create a new access key on "Access Keys" page. - -![Magento Marketplace generated access keys](../assets/images/magento-marketplace-access-keys.jpg) - -> ℹ️ In Magento's Dev Docs you can get more information about authentication keys. -> -> - -
- 🧵 Here's a step-by-step version of how to create access keys - -1. [Sign in](https://account.magento.com/customer/account/login) into Magento Marketplace; - - ![Magento Marketplace sign-in form](../assets/images/magento-marketplace-signin-form.jpg) - -2. In your Magento Account page, click in the "Marketplace" tab; - - ![Magento Marketplace link](../assets/images/magento-marketplace-link.jpg) - -3. In your user's menu, click in the "My Profile" item; - - ![Magento Marketplace link](../assets/images/magento-marketplace-my-profile-link.jpg) - -4. Click in the "Access Keys" link; - - ![Magento Marketplace Access Keys link](../assets/images/magento-marketplace-access-keys-link.jpg) - -5. Click in the "Create a new access key" button; - - ![Magento Marketplace create access key button](../assets/images/magento-marketplace-create-access-key-button.jpg) - -6. Type in a name for these access keys and click in the "OK" button; - - ![Magento Marketplace create access key button](../assets/images/magento-marketplace-access-key-form.jpg) - -
- -### Setting up the Magento 2 store - -To reduce the complexity we're will use the one-line setup command of [`markshust/docker-magento`](https://github.com/markshust/docker-magento). So you just have to run the command below to create the store. After running it will ask for the Username and Password, use your public access key as username and your private access key as password. - -```sh -curl -s https://raw.githubusercontent.com/markshust/docker-magento/master/lib/onelinesetup | bash -s -- magento.test 2.4.4 -``` - -Here's a recording of these steps: - - - -### Setting up the authentication - -In the Magento 2 folder, copy the `src/auth.json.sample` file to `src/auth.json`. - -```sh -cp src/auth.json.sample src/auth.json -``` - -Update the username and password values with your Magento public and private keys, respectively. - -```json -{ - "http-basic": { - "repo.magento.com": { - "username": "a1c69cb…", - "password": "af041560…" - } - } -} -``` - -Finally, copy the file to the container by running `bin/copytocontainer auth.json`. - -```sh -bin/copytocontainer auth.json -``` - -### Populating with sample data - -In the Magento 2 folder, execute the the commands below to add deploy sample data to your store. - -```sh -bin/magento sampledata:deploy -``` - -And make sure the configuration was correctly registered. - -```sh -bin/magento setup:upgrade -``` - -### Enabling CORS - -In order to accept requests from other domains, e.g. `magento.dev`, you may need to enable CORS origins in your Magento store. - -In the Magento 2 folder, add the package `graycore/magento2-cors` by running the command below. - -```sh -bin/composer require graycore/magento2-cors -``` - -Add the following configuration at the end of `src/app/etc/env.php`. - -```php - 'system' => [ - 'default' => [ - 'web' => [ - 'graphql' => [ - 'cors_max_age' => 86400, - 'cors_allow_credentials' => 0, - 'cors_allowed_methods' => 'POST, OPTIONS, GET', - 'cors_allowed_headers' => 'Content-Currency, Store, X-Magento-Cache-Id, X-Captcha, Content-Type, Authorization, DNT, TE', - 'cors_allowed_origins' => '*' - ] - ] - ] - ] -``` - -Enable the graycore cors. - -```sh -bin/magento module:enable Graycore_Cors -``` - -Make sure the configuration was correctly registered. - -```sh -bin/magento setup:upgrade -``` - -## Creating the Vue Storefront for Magento 2 - -That's the easy part, you just need to execute the `init` command of Vue Storefront CLI in the project root folder. It will ask you for the project name and the integration. Keep in mind that the project name will also be used as the project folder name, and be sure to select the Magento 2 integration. - -```sh -npx @vue-storefront/cli init -``` - -Here's a recording of these steps: - - - -## How to start if you want to contribute? - -Want to contribute? Ping us on `magento2-vsf2` channel on [our Discord](https://discord.vuestorefront.io)! diff --git a/docs/guide/roadmap.md b/docs/guide/roadmap.md deleted file mode 100644 index 52c29ff42..000000000 --- a/docs/guide/roadmap.md +++ /dev/null @@ -1,32 +0,0 @@ -# Roadmap - -The current goal is to release a stable 1.0.0 version by the end of February. Details below. - -## January 2022 - -- finish multi-store functionality [done] -- performance improvements - - analysis [done] - - improve the speed of communication with Magento [in progress] - - Redis Caching [done] - - CDNs [done] -- Design QA & improvements [done] - -## February 2022 - -- performance improvements - - meet web core vitals or at least 80 score -- quality assurance -- user acceptance tests - -### Milestone: Release stable 1.0.0 version by the end of February - -## March 2022 - -- Load tests -- Accessibility tests & improvements -- extensibility - - improve docs - - add the possibility to add plugins - - add the possibility to install external extensions - - theming diff --git a/docs/guide/supported-features.md b/docs/guide/supported-features.md index b02db5176..d63c72793 100644 --- a/docs/guide/supported-features.md +++ b/docs/guide/supported-features.md @@ -1,6 +1,6 @@ # Supported features -This page shows the Magento 2 features supported by this integration. If the feature you need is not supported, check out our [Roadmap](./roadmap.html) or reach out to us on [our Discord server](https://discord.vuestorefront.io/). +This page shows the Magento 2 features supported by this integration. If the feature you need is not supported, reach out to us on [our Discord server](https://discord.vuestorefront.io/). ## Product types From 08fb56501eadffc847094443d07721ccb2ea35f1 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 13 May 2022 11:45:33 +0200 Subject: [PATCH 370/486] docs: remove unused images --- .../magento-marketplace-access-key-form.jpg | Bin 27038 -> 0 bytes .../magento-marketplace-access-keys-link.jpg | Bin 20668 -> 0 bytes ...nto-marketplace-create-access-key-button.jpg | Bin 14206 -> 0 bytes docs/assets/images/magento-marketplace-link.jpg | Bin 21088 -> 0 bytes .../magento-marketplace-my-profile-link.jpg | Bin 20019 -> 0 bytes .../images/magento-marketplace-signin-form.jpg | Bin 26312 -> 0 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/assets/images/magento-marketplace-access-key-form.jpg delete mode 100644 docs/assets/images/magento-marketplace-access-keys-link.jpg delete mode 100644 docs/assets/images/magento-marketplace-create-access-key-button.jpg delete mode 100644 docs/assets/images/magento-marketplace-link.jpg delete mode 100644 docs/assets/images/magento-marketplace-my-profile-link.jpg delete mode 100644 docs/assets/images/magento-marketplace-signin-form.jpg diff --git a/docs/assets/images/magento-marketplace-access-key-form.jpg b/docs/assets/images/magento-marketplace-access-key-form.jpg deleted file mode 100644 index 53222f8027c9ed2883aaf461e20c2226c2287154..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27038 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 diff --git a/docs/assets/images/magento-marketplace-access-keys-link.jpg b/docs/assets/images/magento-marketplace-access-keys-link.jpg deleted file mode 100644 index 6dfbafce5df9904dd391bc822c217279e9b2748b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20668 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 IA9?nF0ppU2;s5{u diff --git a/docs/assets/images/magento-marketplace-create-access-key-button.jpg b/docs/assets/images/magento-marketplace-create-access-key-button.jpg deleted file mode 100644 index d5c499a5ab1e3f5e572b65bff409a48d24102524..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14206 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 Ilri*w0K^;wz5oCK diff --git a/docs/assets/images/magento-marketplace-link.jpg b/docs/assets/images/magento-marketplace-link.jpg deleted file mode 100644 index 4c1d3276696614bfb344894489a6a2f44db7ab98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21088 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 diff --git a/docs/assets/images/magento-marketplace-my-profile-link.jpg b/docs/assets/images/magento-marketplace-my-profile-link.jpg deleted file mode 100644 index ffc35b4d8462819ca8e7639079de9212f2bf8b48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20019 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 diff --git a/docs/assets/images/magento-marketplace-signin-form.jpg b/docs/assets/images/magento-marketplace-signin-form.jpg deleted file mode 100644 index b4f61f6dda3284d85cee3eec5e943182fbb2835e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26312 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 From ef531c6fab6f345210c80899554e1f6d37f29b91 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 13 May 2022 11:45:50 +0200 Subject: [PATCH 371/486] docs: update code example --- docs/getting-started/configure-integration.md | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/getting-started/configure-integration.md b/docs/getting-started/configure-integration.md index a83018607..2b73b8dad 100644 --- a/docs/getting-started/configure-integration.md +++ b/docs/getting-started/configure-integration.md @@ -56,19 +56,23 @@ For other properties please follow official [nuxt-i18n documentation](https://i1 In the example configuration below, you need to have two Magento store views with corresponding store codes: `default` and `german`. -```json -locales: [ - { - code: 'default', - file: 'en.js', - iso: 'en_US', - }, - { - code: 'german', - file: 'de.js', - iso: 'de_DE', - } -] +```javascript +// nuxt.config.js + +export default { + locales: [ + { + code: 'default', + file: 'en.js', + iso: 'en_US', + }, + { + code: 'german', + file: 'de.js', + iso: 'de_DE', + } + ] +}; ``` ### Translations From 500ed5c7c52661243a9c7147b63aeb050f895d43 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 13 May 2022 13:20:48 +0200 Subject: [PATCH 372/486] docs: improve landing page --- docs/.vuepress/config.js | 3 ++- docs/getting-started/configure-integration.md | 2 +- docs/index.md | 22 +++++++++++++++---- 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 72d1a7396..107b67d44 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -37,6 +37,7 @@ module.exports = { '@vuepress/search', ], themeConfig: { + sidebarDepth: 0, repo: 'https://github.com/vuestorefront/magento2/', editLinks: true, docsDir: 'docs', @@ -49,7 +50,7 @@ module.exports = { ], sidebar: [ { - title: 'Essentials', + title: '', collapsable: false, children: [ ['/', 'Introduction'], diff --git a/docs/getting-started/configure-integration.md b/docs/getting-started/configure-integration.md index 2b73b8dad..53dff7d0b 100644 --- a/docs/getting-started/configure-integration.md +++ b/docs/getting-started/configure-integration.md @@ -7,7 +7,7 @@ This guide explains the steps needed to install and set up Vue Storefront for Ma Before you can get started, you need the following: - **Node.js 16** installed, -- Magento 2 server configured following the [Configuring Magento store](/getting-started/configure-magento.html) guide. +- Magento 2 server configured following the [Configuring Magento](/getting-started/configure-magento.html) guide. ## Creating the Vue Storefront for Magento 2 diff --git a/docs/index.md b/docs/index.md index f336ed2ff..13dd1e2ce 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,7 +1,21 @@ - + -# Vue Storefront 2 integration with Magento 2 +# Vue Storefront 2 for Magento [BETA] -This project is a Magento 2 integration for Vue Storefront 2. +Welcome to the documentation of Vue Storefront 2 integration for Magento 2. -This integration is currently a **Beta** and not ready for production usage. You can help us to make the integration production-ready faster by reporting bugs and contributing to the code at the [repository issues page](https://github.com/vuestorefront/magento2/issues). +It's part of our ecosystem of integrations and extensions, which you can learn more about in our [core documentation](https://docs.vuestorefront.io/v2/). + +## Demo + +If you want to see the integration in action, check out our [demo environments](/guide/environments.html). + +## Where to start? + +To get started, see the following guides: + +- [Configuring Magento](/getting-started/configure-magento.html) to install the Magento server and configure it for Vue Storefront. +- [Configuring Vue Storefront](/getting-started/configure-integration.html) to install Vue Storefront and configure it. From 42afd5ba390f71f5dfc24dd0bb938c898c48abec Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 16 May 2022 09:58:11 +0200 Subject: [PATCH 373/486] docs: remove Asciinema recordings --- docs/.vuepress/components/Asciinema.vue | 31 ------------------- docs/getting-started/configure-integration.md | 4 --- docs/getting-started/configure-magento.md | 4 --- 3 files changed, 39 deletions(-) delete mode 100644 docs/.vuepress/components/Asciinema.vue diff --git a/docs/.vuepress/components/Asciinema.vue b/docs/.vuepress/components/Asciinema.vue deleted file mode 100644 index 20e401191..000000000 --- a/docs/.vuepress/components/Asciinema.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/docs/getting-started/configure-integration.md b/docs/getting-started/configure-integration.md index 53dff7d0b..aa5b64f0a 100644 --- a/docs/getting-started/configure-integration.md +++ b/docs/getting-started/configure-integration.md @@ -17,10 +17,6 @@ To install Vue Storefront, run the command below. It will ask you for the projec npx @vue-storefront/cli init ``` -Here's a recording of these steps: - - - ## Setting environment variables After installation, the first step is to configure the integration using the environment variables. diff --git a/docs/getting-started/configure-magento.md b/docs/getting-started/configure-magento.md index 83ae6bac6..773b934f9 100644 --- a/docs/getting-started/configure-magento.md +++ b/docs/getting-started/configure-magento.md @@ -36,10 +36,6 @@ Run the command below to create the store. It will ask you for the Username and curl -s https://raw.githubusercontent.com/markshust/docker-magento/master/lib/onelinesetup | bash -s -- magento.test 2.4.4 ``` -Here's a recording of these steps: - - - ### Setting up the authentication In the Magento 2 folder, copy the `src/auth.json.sample` file and rename it to `src/auth.json`. You can do it manually or use the following command: From b9594e9739dc9b49f67984522159c1587500169a Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 16 May 2022 11:13:21 +0200 Subject: [PATCH 374/486] docs: update installation guide based on PR feedback --- docs/.vuepress/config.js | 1 + docs/getting-started/configure-integration.md | 95 +++---------------- docs/getting-started/configure-magento.md | 43 ++++++--- docs/guide/image-optimization.md | 78 +++++++++++++++ docs/guide/supported-features.md | 6 +- 5 files changed, 124 insertions(+), 99 deletions(-) create mode 100644 docs/guide/image-optimization.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 107b67d44..0cb318d47 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -71,6 +71,7 @@ module.exports = { title: 'Guides', collapsable: false, children: [ + ['/guide/image-optimization', 'Image optimization'], ['/guide/override-queries', 'Override queries'], ['/guide/testing', 'Testing'], ['/guide/recaptcha', 'ReCaptcha'], diff --git a/docs/getting-started/configure-integration.md b/docs/getting-started/configure-integration.md index aa5b64f0a..2ce2233a0 100644 --- a/docs/getting-started/configure-integration.md +++ b/docs/getting-started/configure-integration.md @@ -9,6 +9,12 @@ Before you can get started, you need the following: - **Node.js 16** installed, - Magento 2 server configured following the [Configuring Magento](/getting-started/configure-magento.html) guide. +To check the Node version you are using, run the following command: + +```bash +node -v +``` + ## Creating the Vue Storefront for Magento 2 To install Vue Storefront, run the command below. It will ask you for the project name and the integration of your choice. Keep in mind that the project name will also be used as the folder name, and be sure to select the Magento 2 integration. @@ -17,7 +23,7 @@ To install Vue Storefront, run the command below. It will ask you for the projec npx @vue-storefront/cli init ``` -## Setting environment variables +### 1. Configure environment variables After installation, the first step is to configure the integration using the environment variables. @@ -30,17 +36,17 @@ After installation, the first step is to configure the integration using the env 3. Update values in the `.env` file. -## Populating store configuration +### 2. Setup store configuration The `plugins/storeConfigPlugin.ts` plugin loads store configuration data from Magento and saves it into the Pinia store under the `$state.storeConfig` property. By default, the amount of data loaded from Magento is minimal to avoid over-fetching, but as your application grows, you might need to pull more data. This plugin loads the store configuration data based on a query in the `plugins/query/StoreConfig.gql.ts` file. You can modify this file to change what data is loaded. -## Configuring multistore and localization +### 3. Configure multistore and localization Each Magento store view needs a corresponding locale configuration object in the `i18n` object in the `nuxt.config.js` file. -### `i18n.locales` +#### 3.1 `i18n.locales` The `i18n.locales` array contains all supported locales. Each item in this array is an object containing the following properties: @@ -71,88 +77,9 @@ export default { }; ``` -### Translations +#### 3.2 Translations When working with translation in your application, you need to: 1. Add translations in Magento for products and categories. 2. Update the `i18n.locales` array in the `nuxt.config.js` file and add translations to the corresponding files in the `lang` directory. - -## Optimizing images - -You can use external image providers to optimize your images thanks to the [nuxt-img](https://image.nuxtjs.org/) module. - -By default, Vue Storefront uses the `ipx` provider, an open-source, self-hosted image optimizer. - -### Configuring external image provider - -If you decide to use an external image provider, you have to update the following environment variables inside the `.env` file: - -1. `VSF_MAGENTO_BASE_URL` - base URL of Magento shop. The `useImage` composable uses it to extract the image path from the full Magento URL. -2. `VSF_IMAGE_PROVIDER` - name of the external provider, e.g. `cloudinary`. See the [Providers](https://image.nuxtjs.org/getting-started/providers) page for more information. -3. `VSF_IMAGE_PROVIDER_DOMAIN` - domain of the image provider. -4. `VSF_IMAGE_PROVIDER_BASE_URL` - base URL of the image provider to upload images. - -See the `image` property in the `nuxt.config.js` to learn how these environment variables are used and to configure any [other options](https://image.nuxtjs.org/api/options) supported by the [nuxt-img](https://image.nuxtjs.org/) plugin. - -### Synchronize Magento images with an external provider - -You need to synchronize all your images from the two folders below manually or create a script to do so: - -- `media` folder in Magento. We recommend using the same path as in Magento. For example, if your image path is `{MAGENTO_BASE_URL}/media/catalog/product/{IMAGE_PATH}`, you should have the corresponding image in your external provider with the same path, e.g. `media/catalog/product/{IMAGE_PATH}`. -- `static` folder in Vue Storefront. - -### The `useImage()` composable - -Magento GraphQL API returns an URL to cached images, e.g. `{MAGENTO_BASE_URL}/media/catalog/product/cache/{IMAGE_PATH}`. When you download all images from your server's `media` directory, paths don't include the `cache/***/` part. - -Because of that, we created the `useImage()` hook, which provides the `getMagentoImage(fullImageUrl: string)` method. This method returns an URL to the image without the Magento base URL and cache part. You can use it to get images from external providers. - -Here's an example of how to use the `useImage()` composable: - -```vue - - - -``` - -### ImageSizes enum - -There is a helper object in the `enums/imageEnums.js` file that export configuration for various image types: - -```javascript -module.exports = { - productCard: { - width: 216, - height: 268, - }, - productCardHorizontal: { - width: 140, - height: 200, - }, - cartItem: { - width: 100, - height: 100, - }, -}; -``` diff --git a/docs/getting-started/configure-magento.md b/docs/getting-started/configure-magento.md index 773b934f9..d0a894fec 100644 --- a/docs/getting-started/configure-magento.md +++ b/docs/getting-started/configure-magento.md @@ -18,7 +18,7 @@ mkdir server cd server ``` -### Getting access keys for Magento +### 1. Get Magento Marketplace access keys Registry that stores Magento and other third-party packages requires authentication. You'll need to generate access keys in the Magento Marketplace to install them. @@ -26,7 +26,7 @@ Follow the [Get your authentication keys](https://devdocs.magento.com/guides/v2. ![Access keys generated in Magento Marketplace](../assets/images/magento-marketplace-access-keys.jpg) -### Setting up the Magento 2 store +### 2. Install Magento 2 store To simplify the setup, let's use the [`markshust/docker-magento`](https://github.com/markshust/docker-magento) script. @@ -36,7 +36,7 @@ Run the command below to create the store. It will ask you for the Username and curl -s https://raw.githubusercontent.com/markshust/docker-magento/master/lib/onelinesetup | bash -s -- magento.test 2.4.4 ``` -### Setting up the authentication +### 3. Setup authentication In the Magento 2 folder, copy the `src/auth.json.sample` file and rename it to `src/auth.json`. You can do it manually or use the following command: @@ -63,21 +63,26 @@ Finally, copy the file to the container by running the following command: bin/copytocontainer auth.json ``` -### Populating with sample data +### 4. Increse default GraphQL query complexity -In the Magento 2 folder, execute the commands below to add sample data to your store. +By default, Magento 2 allows maximum GraphQL query complexity of 300 and depth of 20 (see [#32427](https://github.com/magento/magento2/issues/32427#issuecomment-860478483)). You need to change these values using the [GraphQL CustomConfig module](https://github.com/caravelx/module-graphql-config), which allows configuring these values in the admin panel. -```sh -bin/magento sampledata:deploy +To install the Magento 2 GraphQL Config module, run the following commands on your Magento installation: + +```bash +composer require caravelx/module-graphql-config +php bin/magento module:enable Caravel_GraphQlConfig +php bin/magento setup:upgrade +php bin/magento setup:di:compile +php bin/magento setup:static-content:deploy ``` -Then update the configuration: +Then go to the admin panel, find the configuration panel of the `GraphQL CustomConfig` module and set: -```sh -bin/magento setup:upgrade -``` +- **complexity** to 1500, +- **depth** to 20. -### Enabling CORS +### 5. Enable CORS You may need to enable CORS origins in your Magento store to accept requests from other domains, e.g., `magento.dev`. In the Magento 2 folder, add the package `graycore/magento2-cors` by running the command below: @@ -114,3 +119,17 @@ Then update the configuration: ```sh bin/magento setup:upgrade ``` + +### 6. Populate store with sample data (optional) + +In the Magento 2 folder, execute the commands below to add sample data to your store. + +```sh +bin/magento sampledata:deploy +``` + +Then update the configuration: + +```sh +bin/magento setup:upgrade +``` diff --git a/docs/guide/image-optimization.md b/docs/guide/image-optimization.md new file mode 100644 index 000000000..914f191c6 --- /dev/null +++ b/docs/guide/image-optimization.md @@ -0,0 +1,78 @@ +# Image optimization + +You can use external image providers to optimize your images thanks to the [nuxt-img](https://image.nuxtjs.org/) module. + +By default, Vue Storefront uses the `ipx` provider, an open-source, self-hosted image optimizer. + +## Configure external image provider + +If you decide to use an external image provider, you have to update the following environment variables inside the `.env` file: + +1. `VSF_MAGENTO_BASE_URL` - base URL of Magento shop. The `useImage` composable uses it to extract the image path from the full Magento URL. +2. `VSF_IMAGE_PROVIDER` - name of the external provider, e.g. `cloudinary`. See the [Providers](https://image.nuxtjs.org/getting-started/providers) page for more information. +3. `VSF_IMAGE_PROVIDER_DOMAIN` - domain of the image provider. +4. `VSF_IMAGE_PROVIDER_BASE_URL` - base URL of the image provider to upload images. + +See the `image` property in the `nuxt.config.js` to learn how these environment variables are used and to configure any [other options](https://image.nuxtjs.org/api/options) supported by the [nuxt-img](https://image.nuxtjs.org/) plugin. + +## Synchronize Magento images with an external provider + +You need to synchronize all your images from the two folders below manually or create a script to do so: + +- `media` folder in Magento. We recommend using the same path as in Magento. For example, if your image path is `{MAGENTO_BASE_URL}/media/catalog/product/{IMAGE_PATH}`, you should have the corresponding image in your external provider with the same path, e.g. `media/catalog/product/{IMAGE_PATH}`. +- `static` folder in Vue Storefront. + +## The `useImage()` composable + +Magento GraphQL API returns an URL to cached images, e.g. `{MAGENTO_BASE_URL}/media/catalog/product/cache/{IMAGE_PATH}`. When you download all images from your server's `media` directory, paths don't include the `cache/***/` part. + +Because of that, we created the `useImage()` hook, which provides the `getMagentoImage(fullImageUrl: string)` method. This method returns an URL to the image without the Magento base URL and cache part. You can use it to get images from external providers. + +Here's an example of how to use the `useImage()` composable: + +```vue + + + +``` + +## Configure `ImageSizes` enum + +There is a helper object in the `enums/imageEnums.js` file that export configuration for various image types: + +```javascript +module.exports = { + productCard: { + width: 216, + height: 268, + }, + productCardHorizontal: { + width: 140, + height: 200, + }, + cartItem: { + width: 100, + height: 100, + }, +}; +``` diff --git a/docs/guide/supported-features.md b/docs/guide/supported-features.md index d63c72793..bb4feaf67 100644 --- a/docs/guide/supported-features.md +++ b/docs/guide/supported-features.md @@ -30,11 +30,11 @@ This page shows the Magento 2 features supported by this integration. If the fea | Grid/list mode | ✅ | | Adding product to cart | ✅ | | Adding product to wishlist | ✅ | -| Configurable product swatches | ❌ | +| Configurable product swatches | ✅ | | Filtering | ✅ | | Sorting | ✅ | -| Breadcrumb | ❌ | -| Category Landing Pages | ❌ | +| Breadcrumb | ✅ | +| Category Landing Pages | ✅ | ## Product page From 757bb37f3fe92be5a626aaf4d0a90e6d4969c0e2 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 16 May 2022 11:20:53 +0200 Subject: [PATCH 375/486] docs: fix typos in installation guides --- docs/getting-started/configure-integration.md | 2 +- docs/getting-started/configure-magento.md | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/getting-started/configure-integration.md b/docs/getting-started/configure-integration.md index 2ce2233a0..a6799cd81 100644 --- a/docs/getting-started/configure-integration.md +++ b/docs/getting-started/configure-integration.md @@ -25,7 +25,7 @@ npx @vue-storefront/cli init ### 1. Configure environment variables -After installation, the first step is to configure the integration using the environment variables. +After installation, the first step is configuring the integration using the environment variables. 1. Go to the root folder of your project. 2. Make a copy of the `.env.example` file and rename it to `.env`. You can do it manually or use the following command: diff --git a/docs/getting-started/configure-magento.md b/docs/getting-started/configure-magento.md index d0a894fec..122c92853 100644 --- a/docs/getting-started/configure-magento.md +++ b/docs/getting-started/configure-magento.md @@ -20,7 +20,7 @@ cd server ### 1. Get Magento Marketplace access keys -Registry that stores Magento and other third-party packages requires authentication. You'll need to generate access keys in the Magento Marketplace to install them. +Registry that stores Magento and other third-party packages require authentication. You'll need to generate access keys in the Magento Marketplace to install them. Follow the [Get your authentication keys](https://devdocs.magento.com/guides/v2.4/install-gde/prereq/connect-auth.html) guide to generate new access keys. @@ -63,9 +63,9 @@ Finally, copy the file to the container by running the following command: bin/copytocontainer auth.json ``` -### 4. Increse default GraphQL query complexity +### 4. Increase default GraphQL query complexity -By default, Magento 2 allows maximum GraphQL query complexity of 300 and depth of 20 (see [#32427](https://github.com/magento/magento2/issues/32427#issuecomment-860478483)). You need to change these values using the [GraphQL CustomConfig module](https://github.com/caravelx/module-graphql-config), which allows configuring these values in the admin panel. +For security reasons, Magento 2, by default, allows maximum GraphQL query complexity of 300 and depth of 20. You need to change these values using the [GraphQL CustomConfig module](https://github.com/caravelx/module-graphql-config), which allows configuring these values in the admin panel. To install the Magento 2 GraphQL Config module, run the following commands on your Magento installation: @@ -77,11 +77,13 @@ php bin/magento setup:di:compile php bin/magento setup:static-content:deploy ``` -Then go to the admin panel, find the configuration panel of the `GraphQL CustomConfig` module and set: +Then go to the admin panel, find the configuration panel of the `GraphQL CustomConfig` module, and set: - **complexity** to 1500, - **depth** to 20. +For more information, see the [GraphQL security configuration](https://devdocs.magento.com/guides/v2.4/graphql/security-configuration.html) page. + ### 5. Enable CORS You may need to enable CORS origins in your Magento store to accept requests from other domains, e.g., `magento.dev`. In the Magento 2 folder, add the package `graycore/magento2-cors` by running the command below: From 7ef9eaed0b27ce6c7a614e14e1af1e5d9936f832 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Wed, 11 May 2022 14:33:50 +0200 Subject: [PATCH 376/486] docs: update composables docs --- packages/theme/composables/useApi/index.ts | 114 +++++++----------- .../checkout/composables/useBilling/index.ts | 4 +- .../composables/useBilling/useBilling.ts | 4 +- 3 files changed, 47 insertions(+), 75 deletions(-) diff --git a/packages/theme/composables/useApi/index.ts b/packages/theme/composables/useApi/index.ts index 48cdf4e17..9f8393e56 100644 --- a/packages/theme/composables/useApi/index.ts +++ b/packages/theme/composables/useApi/index.ts @@ -1,20 +1,58 @@ import { useContext } from '@nuxtjs/composition-api'; import type { Variables } from 'graphql-request'; -type Request = ( +export type Request = ( document: string, variables?: VARIABLES, requestHeaders?: HeadersInit ) => Promise; -/** The interface provided by {@link useApi} composable. */ +/** + * Methods returned by the {@link useApi|useApi()} composable. + */ export interface UseApiInterface { /** - * Executes received GraphQL Query with optional variables and headers and + * Executes received GraphQL query with optional variables and headers and * returns the result. + * + * @example + * + * Execute a GraphQL query and handle its error, loading and result: + * + * ```ts + * import { useApi } from '~/composables/useApi'; + * + * const GET_CART_PRICE_QUERY = ` + * query GET_CART_PRICE_QUERY($cartId: String!) { + * cart(cart_id: $cartId) { + * prices { + * subtotal_excluding_tax { + * value + * } + * } + * } + * } + * `; + * + * export default { + * setup() { + * const { query } = useApi(); + * + * async function getCartPrice(cartId: string) { + * return await query( + * GET_CART_PRICE_QUERY, + * { cartId }, + * { 'Accept': 'application/json' } + * ); + * } + * } + * }; + * ``` */ query: Request; + // TODO: Add code sample + /** * Executes received GraphQL Mutation with optional variables and headers and * returns the result. @@ -24,76 +62,6 @@ export interface UseApiInterface { /** * The `useApi()` composable allows executing GraphQL queries and mutations. - * - * @example - * - * Execute a GraphQL Query and handle its error, loading and result: - * - * ```ts - * import { ref, readonly } from '@nuxtjs/composition-api'; - * import { useApi } from '~/composables/useApi'; - * - * type GetCartPriceQueryVariables = { cartId: string }; - * - * type GetCartPriceQueryData = { - * cart: { - * prices: { - * subtotal_excluding_tax: { - * value: number; - * }; - * }[]; - * }; - * }; - * - * const GET_CART_PRICE_QUERY = ` - * query GET_CART_PRICE_QUERY($cartId: String!) { - * cart(cart_id: $cartId) { - * prices { - * subtotal_excluding_tax { - * value - * } - * } - * } - * } - * `; - * - * export default { - * setup() { - * const { query } = useApi(); - * - * const price = ref(null); - * const loading = ref(false); - * const error = ref(null); - * - * const getCartPrice = async (cartId: string) => { - * loading.value = false; - * try { - * const result = await query< - * GetCartPriceQueryData, - * GetCartPriceQueryVariables, - * >(GET_CART_PRICE_QUERY, { cartId }, { - * 'Accept': 'application/json', - * }); - * - * price.value = result.cart?.prices?.subtotal_excluding_tax?.value ?? null; - * error.value = null; - * } catch (error) { - * price.value = null; - * error.value = error; - * } finally { - * loading.value = false; - * } - * }; - * - * return { - * price: readonly(price), - * error: readonly(error), - * loading: readonly(loading), - * getCartPrice, - * }; - * }, - * }; - * ``` */ export function useApi(): UseApiInterface { const context = useContext(); diff --git a/packages/theme/modules/checkout/composables/useBilling/index.ts b/packages/theme/modules/checkout/composables/useBilling/index.ts index 4283805e4..872f8cd6d 100644 --- a/packages/theme/modules/checkout/composables/useBilling/index.ts +++ b/packages/theme/modules/checkout/composables/useBilling/index.ts @@ -12,8 +12,10 @@ import type { } from './useBilling'; /** - * The `useBilling()` composable allows loading and saving billing information + * The `useBilling` composable allows loading and saving billing information * of the current cart. + * + * See the {@link UseBillingInterface} for a list of methods and values available in this composable. */ export function useBilling(): UseBillingInterface { const context = useContext(); diff --git a/packages/theme/modules/checkout/composables/useBilling/useBilling.ts b/packages/theme/modules/checkout/composables/useBilling/useBilling.ts index d3d607052..994231485 100644 --- a/packages/theme/modules/checkout/composables/useBilling/useBilling.ts +++ b/packages/theme/modules/checkout/composables/useBilling/useBilling.ts @@ -2,7 +2,9 @@ import type { Ref } from '@nuxtjs/composition-api'; import type { BillingCartAddress } from '~/modules/GraphQL/types'; import { ComposableFunctionArgs } from '~/composables/types'; -/** The object used by {@link useBilling} to save new billing information. */ +/** + * The object used by {@link useBilling|useBilling()} to save new billing information. + */ export interface BillingDetails { apartment?: string; city?: string; From 67aced0cc8975ab46be0b2f1f8f936de9d543ee9 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 13 May 2022 15:56:37 +0200 Subject: [PATCH 377/486] docs: update composable docs --- docs/.vuepress/config.js | 30 ++-- packages/theme/composables/useConfig/index.ts | 4 +- .../theme/composables/useConfig/useConfig.ts | 26 +++- .../theme/composables/useContent/index.ts | 76 +--------- .../composables/useContent/useContent.ts | 133 ++++-------------- .../composables/useCountrySearch/index.ts | 2 +- .../useCountrySearch/useCountrySearch.ts | 47 +++++-- .../theme/composables/useCurrency/index.ts | 6 +- .../composables/useCurrency/useCurrency.ts | 44 ++++-- .../composables/useExternalCheckout/index.ts | 7 +- .../useExternalCheckout.ts | 21 ++- packages/theme/composables/useImage/index.ts | 4 +- .../theme/composables/useImage/useImage.ts | 15 +- .../UseMagentoConfiguration.ts | 20 ++- .../useMagentoConfiguration/index.ts | 2 + .../theme/composables/useNewsletter/index.ts | 2 + .../useNewsletter/useNewsletter.ts | 25 ++-- packages/theme/composables/useReview/index.ts | 2 +- .../theme/composables/useReview/useReview.ts | 44 +++++- packages/theme/composables/useStore/index.ts | 2 +- .../theme/composables/useStore/useStore.ts | 18 ++- .../theme/composables/useUiHelpers/index.ts | 2 + .../composables/useUiNotification/index.ts | 2 +- .../theme/composables/useUiState/index.ts | 2 +- .../useUrlResolver/UseUrlResolver.ts | 26 ++-- .../theme/composables/useUrlResolver/index.ts | 2 + .../composables/useCategorySearch/index.ts | 4 +- .../useCategorySearch/useCategorySearch.ts | 23 ++- .../composables/useBilling/useBilling.ts | 33 +++-- .../composables/useShippingProvider/index.ts | 4 +- .../useShippingProvider.ts | 44 ++++-- .../composables/useAddresses/useAddresses.ts | 46 +++--- .../composables/useUserAddress/index.ts | 2 +- .../useUserAddress/useUserAddress.ts | 49 ++++++- 34 files changed, 423 insertions(+), 346 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 0cb318d47..8173d1061 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -91,38 +91,38 @@ module.exports = { ['/api-reference/magento-theme.useaddresses', 'useAddresses()'], ['/api-reference/magento-theme.useapi', 'useApi()'], ['/api-reference/magento-theme.usebilling', 'useBilling()'], - ['/api-reference/magento-theme.usecart', 'useCart()'], - ['/api-reference/magento-theme.usecategory', 'useCategory()'], + ['/api-reference/magento-theme.usecart', 'useCart() [Deprecated]'], + ['/api-reference/magento-theme.usecategory', 'useCategory() [Deprecated]'], ['/api-reference/magento-theme.usecategorysearch', 'useCategorySearch()'], ['/api-reference/magento-theme.useconfig', 'useConfig()'], ['/api-reference/magento-theme.usecontent', 'useContent()'], ['/api-reference/magento-theme.usecountrysearch', 'useCountrySearch()'], ['/api-reference/magento-theme.usecurrency', 'useCurrency()'], ['/api-reference/magento-theme.useexternalcheckout', 'useExternalCheckout()'], - ['/api-reference/magento-theme.usefacet', 'useFacet()'], - ['/api-reference/magento-theme.useforgotpassword', 'useForgotPassword()'], - ['/api-reference/magento-theme.usegetshippingmethods', 'useGetShippingMethods()'], - ['/api-reference/magento-theme.useguestuser', 'useGuestUser()'], + ['/api-reference/magento-theme.usefacet', 'useFacet() [Deprecated]'], + ['/api-reference/magento-theme.useforgotpassword', 'useForgotPassword() [Deprecated]'], + ['/api-reference/magento-theme.usegetshippingmethods', 'useGetShippingMethods() [Deprecated]'], + ['/api-reference/magento-theme.useguestuser', 'useGuestUser() [Deprecated]'], ['/api-reference/magento-theme.useimage', 'useImage()'], ['/api-reference/magento-theme.usemagentoconfiguration', 'useMagentoConfiguration()'], - ['/api-reference/magento-theme.usemakeorder', 'useMakeOrder()'], + ['/api-reference/magento-theme.usemakeorder', 'useMakeOrder() [Deprecated]'], ['/api-reference/magento-theme.usenewsletter', 'useNewsletter()'], - ['/api-reference/magento-theme.usepaymentprovider', 'usePaymentProvider()'], - ['/api-reference/magento-theme.useproduct', 'useProduct()'], - ['/api-reference/magento-theme.userelatedproducts', 'useRelatedProducts()'], + ['/api-reference/magento-theme.usepaymentprovider', 'usePaymentProvider() [Deprecated]'], + ['/api-reference/magento-theme.useproduct', 'useProduct() [Deprecated]'], + ['/api-reference/magento-theme.userelatedproducts', 'useRelatedProducts() [Deprecated]'], ['/api-reference/magento-theme.usereview', 'useReview()'], - ['/api-reference/magento-theme.useshipping', 'useShipping()'], + ['/api-reference/magento-theme.useshipping', 'useShipping() [Deprecated]'], ['/api-reference/magento-theme.useshippingprovider', 'useShippingProvider()'], ['/api-reference/magento-theme.usestore', 'useStore()'], ['/api-reference/magento-theme.useuihelpers', 'useUiHelpers()'], ['/api-reference/magento-theme.useuinotification', 'useUiNotification()'], ['/api-reference/magento-theme.useuistate', 'useUiState()'], - ['/api-reference/magento-theme.useupsellproducts', 'useUpsellProducts()'], + ['/api-reference/magento-theme.useupsellproducts', 'useUpsellProducts() [Deprecated]'], ['/api-reference/magento-theme.useurlresolver', 'useUrlResolver()'], - ['/api-reference/magento-theme.useuser', 'useUser()'], + ['/api-reference/magento-theme.useuser', 'useUser() [Deprecated]'], ['/api-reference/magento-theme.useuseraddress', 'useUserAddress()'], - ['/api-reference/magento-theme.useuserorder', 'useUserOrder()'], - ['/api-reference/magento-theme.usewishlist', 'useWishlist()'], + ['/api-reference/magento-theme.useuserorder', 'useUserOrder() [Deprecated]'], + ['/api-reference/magento-theme.usewishlist', 'useWishlist() [Deprecated]'], ], }, { diff --git a/packages/theme/composables/useConfig/index.ts b/packages/theme/composables/useConfig/index.ts index ab74800de..c94c0d43d 100644 --- a/packages/theme/composables/useConfig/index.ts +++ b/packages/theme/composables/useConfig/index.ts @@ -6,9 +6,9 @@ import { useConfigStore } from '~/stores/config'; import { UseConfigErrors, UseConfigInterface } from './useConfig'; /** - * The `useConfig` composable is responsible for interactions with the configuration in your eCommerce. + * The `useConfig` composable allows interacting with the store configuration. * - * See the {@link UseConfigInterface} page for more information. + * See the {@link UseConfigInterface} for a list of methods and values available in this composable. */ export function useConfig(): UseConfigInterface { const { app } = useContext(); diff --git a/packages/theme/composables/useConfig/useConfig.ts b/packages/theme/composables/useConfig/useConfig.ts index 057a38dd0..76f1700e5 100644 --- a/packages/theme/composables/useConfig/useConfig.ts +++ b/packages/theme/composables/useConfig/useConfig.ts @@ -1,20 +1,32 @@ import { ComputedRef, DeepReadonly, Ref } from '@nuxtjs/composition-api'; import { StoreConfig } from '~/modules/GraphQL/types'; -/** Errors returned by the {@link useConfig} composable */ +/** + * Errors that occured in the {@link useConfig|useConfig()} composable + */ export interface UseConfigErrors { - /** Error when loading configuration fails, otherwise is `null` */ + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; } /** - * Represents the data and methods returned by the {@link useConfig} composable + * The refs and methods returned by the {@link useConfig|useConfig()} composable */ export interface UseConfigInterface { - /** Returns the loaded config as computed property */ + /** + * Store configuration loaded using the `load` method + */ config: ComputedRef, - /** Return state of loadConfig Function as computed property */ + + /** + * Indicates whether any of the methods is in progress + */ loading: DeepReadonly>, - /** Function to load the config */ - load (): Promise + + /** + * Loads store configuration + */ + load(): Promise } diff --git a/packages/theme/composables/useContent/index.ts b/packages/theme/composables/useContent/index.ts index 33f030f2a..12b19a1e9 100644 --- a/packages/theme/composables/useContent/index.ts +++ b/packages/theme/composables/useContent/index.ts @@ -8,83 +8,9 @@ import type { ComposableFunctionArgs } from '../types'; import type { UseContentInterface, UseContentErrors } from './useContent'; /** - * @public * The `useContent` composable allows loading CMS Pages or Blocks from Magento API. * - * @remarks - * Under the hood, it calls the following Server Middleware API methods: - * - * - {@link @vue-storefront/magento-api#cmsBlocks} for loading CMS blocks - * - * - {@link @vue-storefront/magento-api#cmsPage} for loading CMS pages - * - * It is currently used in: - * - * - `components/ContentBlocks.vue` - * - * - `pages/Page.vue` - * - * @example - * Initialization in component: - * - * ```typescript - * import { useContent } from '~/composables'; - * - * export default { - * setup() { - * const { loading, error, loadPage, loadBlocks } = useContent(); - * } - * } - * ``` - * - * @example - * Load CMS Page: - * - * ```typescript - * import { useFetch } from '@nuxtjs/composition-api'; - * import { useContent } from '~/composables'; - * - * export default { - * setup() { - * const { loading, error, loadPage } = useContent(); - * - * const page = ref({}); - * const pageId = 'about-us' - * - * useFetch(async () => { - * page.value = await loadPage({ identifier: pageId }); - * - * if (error?.value?.page || !page.value) { - * // place for handle 404 error - * } - * }); - * } - * } - * ``` - * More example with loading CMS Page: {@link UseContentInterface.loadPage}. - * - * @example - * Load CMS Block: - * - * ```typescript - * import { useFetch, ref } from '@nuxtjs/composition-api'; - * import { useContent } from '~/composables'; - * - * export default { - * setup(props) { - * const { loadBlocks } = useContent(); - * const blocks = ref([]); - * - * useFetch(async () => { - * if (props.identifiers) { - * blocks.value = await loadBlocks(['block-a', 'block-b`]); - * } - * }); - * } - * } - * ``` - * - * More example with loading CMS Page: {@link UseContentInterface.loadBlocks}. + * See the {@link UseContentInterface} for a list of methods and values available in this composable. */ export function useContent(): UseContentInterface { const loading: Ref = ref(false); diff --git a/packages/theme/composables/useContent/useContent.ts b/packages/theme/composables/useContent/useContent.ts index 45000ead0..6d03dd786 100644 --- a/packages/theme/composables/useContent/useContent.ts +++ b/packages/theme/composables/useContent/useContent.ts @@ -2,37 +2,47 @@ import type { DeepReadonly, Ref } from '@nuxtjs/composition-api'; import type { CmsPage, CmsBlock } from '~/modules/GraphQL/types'; import type { ComposableFunctionArgs } from '../types'; +/** + * Errors that occured in the {@link useContent|useContent()} composable + */ export interface UseContentErrors { /** - * Errors related to CMS page loading + * Contains error if `loadPage` method failed, otherwise is `null` */ - page: Error; + page: Error | null; + /** - * Errors related to CMS blocks loading + * Contains error if `loadBlocks` method failed, otherwise is `null` */ - blocks: Error; + blocks: Error | null; } /** - * `UseContentInterface` is used by useContent composable, and it's responsible for fetching CMS data from Magento. + * The refs and methods returned by the {@link useContent|useContent()} composable */ export interface UseContentInterface { /** - * Loading state. It returns true when loading data from Magento is in progress + * Indicates whether any of the methods is in progress */ loading: DeepReadonly>; /** - * Contains errors from any of the methods. + * Contains errors from the composable methods */ error: DeepReadonly>; + /** - * Load CMS Page from Magento + * Loads CMS page + * + * @remarks * - * Returns Promise with {@link CmsPage} + * Internally, it calls the {@link @vue-storefront/magento-api#cmsPage} API endpoint + * and accepts custom query named `cmsPage`. * * @example - * Load CMS Page using the useFetch composition-api hook: + * + * Load CMS Page using the useFetch hook: + * * ```typescript * import { useFetch, ref } from '@nuxtjs/composition-api'; * import { useContent } from '~/composables'; @@ -48,112 +58,29 @@ export interface UseContentInterface { * page.value = await loadPage({ identifier: pageId }); * * if (error?.value?.page || !page.value) { - * // place for handle 404 error - * } - * }); - * } - * } - * ``` - * - * @example - * Load CMS Page using the useAsync Composition API hook: - * ```typescript - * import { useAsync } from '@nuxtjs/composition-api'; - * import { useContent } from '~/composables'; - * - * export default { - * setup() { - * const { loadPage } = useContent(); - * const pageId = 'about-us' - * - * const page = useAsync(async () => { - * const pageData = await loadPage({ identifier: pageId }); - * - * if (!pageData.value) { - * // place for handle 404 error - * } - * - * return pageData; - * }); - * } - * } - * ``` - * - * @example - * Load CMS Page on client side using the onMounted Composition API hook: - * ```typescript - * import { onMounted, ref } from '@nuxtjs/composition-api'; - * import { useContent } from '~/composables'; - * - * export default { - * setup() { - * const { loadPage } = useContent(); - * const page = ref({}); - * const pageId = 'about-us' - * - * onMounted(async () => { - * pageData.value = await loadPage({ identifier: pageId }); - * - * if (!pageData.value) { - * // place for handle 404 error + * // Handle error * } * }); * } * } * ``` */ - loadPage: (params: ComposableFunctionArgs<{ identifier: string }>) => Promise; + loadPage(params: ComposableFunctionArgs<{ identifier: string }>): Promise; /** - * Load CMS block from Magento - * - * Returns Promise with array of {@link CmsBlock} + * Loads CMS block * - * @example - * Load CMS Block on server side using the useFetch Composition API hook: - * ```typescript - * import { useFetch, ref } from '@nuxtjs/composition-api'; - * import { useContent } from '~/composables'; - * - * export default { - * setup(props) { - * const { loadBlocks } = useContent(); - * const blocks = ref([]); + * @remarks * - * useFetch(async () => { - * if (props.identifiers) { - * blocks.value = await loadBlocks(['block-a', 'block-b`]); - * } - * }); - * } - * } - * ``` + * Internally, it calls the {@link @vue-storefront/magento-api#cmsBlocks} API endpoint + * and accepts custom query named `cmsBlocks`. * * @example - * Load CMS Block on server side using the useAsync Composition API hook: - * ```typescript - * import { useAsync } from '@nuxtjs/composition-api'; - * import { useContent } from '~/composables'; - * - * export default { - * setup(props) { - * const { loadBlocks } = useContent(); - * - * const blocks = useAsync(async () => { - * if (props.identifiers) { - * return await loadBlocks(['block-a', 'block-b`]); - * } * - * return null; - * }); - * } - * } - * ``` + * Load CMS Block using the useFetch hook: * - * @example - * Load CMS Block on client side using the onMounted Composition API hook: * ```typescript - * import { onMounted, ref } from '@nuxtjs/composition-api'; + * import { useFetch, ref } from '@nuxtjs/composition-api'; * import { useContent } from '~/composables'; * * export default { @@ -161,7 +88,7 @@ export interface UseContentInterface { * const { loadBlocks } = useContent(); * const blocks = ref([]); * - * onMounted(async () => { + * useFetch(async () => { * if (props.identifiers) { * blocks.value = await loadBlocks(['block-a', 'block-b`]); * } @@ -170,5 +97,5 @@ export interface UseContentInterface { * } * ``` */ - loadBlocks: (params: ComposableFunctionArgs<{ identifiers: string[] }>) => Promise; + loadBlocks(params: ComposableFunctionArgs<{ identifiers: string[] }>): Promise; } diff --git a/packages/theme/composables/useCountrySearch/index.ts b/packages/theme/composables/useCountrySearch/index.ts index c21b75d1a..605559780 100644 --- a/packages/theme/composables/useCountrySearch/index.ts +++ b/packages/theme/composables/useCountrySearch/index.ts @@ -5,7 +5,7 @@ import { Maybe, Country } from '~/modules/GraphQL/types'; import { UseCountrySearchInterface } from './useCountrySearch'; /** - * The `useCountrySearch` composable is responsible for fetching a list of countries or a single country by id + * The `useCountrySearch` composable allows fetching a list of countries or a single country by ID * * See the {@link UseCountrySearchInterface} page for more information. */ diff --git a/packages/theme/composables/useCountrySearch/useCountrySearch.ts b/packages/theme/composables/useCountrySearch/useCountrySearch.ts index 19e7fb7ee..328364973 100644 --- a/packages/theme/composables/useCountrySearch/useCountrySearch.ts +++ b/packages/theme/composables/useCountrySearch/useCountrySearch.ts @@ -3,33 +3,58 @@ import { Countries, ComposableFunctionArgs } from '~/composables/types'; import { Maybe, Country } from '~/modules/GraphQL/types'; /** - * Errors returned by the {@link useCountrySearch} composable + * Errors that occured in the {@link useCountrySearch|useCountrySearch()} composable */ export interface UseCountrySearchErrors { - /** Error when searching for a country fails, otherwise is `null` */ + /** + * Contains error if `search` method failed, otherwise is `null` + */ search: Error | null - /** Error when loading the list of countries fails, otherwise is `null` */ + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null } /** - * Params accepted by the `search` method in the {@link useCountrySearch} composable + * The params object accepted by the `save`, `update` and `remove` methods in the {@link useCountrySearch|useCountrySearch()} composable */ export type UseCountrySearchParams = ComposableFunctionArgs<{ id: string; }>; /** - * Represents data and methods returned from the {@link useCountrySearch} composable + * The refs and methods returned by the {@link useCountrySearch|useCountrySearch()} composable */ export interface UseCountrySearchInterface { - /** Fetches the array of registered countries */ - load (): Promise>; - /** Fetches a country by its id */ - search (params: UseCountrySearchParams): Promise>; - /** Returns the current state of search as computed boolean property */ + /** + * Fetches the array of registered countries + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#country} API endpoint + * and accepts the custom queries named `country`. + */ + load(): Promise>; + + /** + * Fetches a country by its id + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#countries} API endpoint + * and accepts the custom queries named `countries`. + */ + search(params: UseCountrySearchParams): Promise>; + + /** + * Indicates whether any of the methods is in progress + */ loading: DeepReadonly>; - /** Reactive object containing the error message, if search failed for any reason. */ + + /** + * Contains errors from the composable methods + */ error: DeepReadonly>; } diff --git a/packages/theme/composables/useCurrency/index.ts b/packages/theme/composables/useCurrency/index.ts index b7f06b5e7..a4129d226 100644 --- a/packages/theme/composables/useCurrency/index.ts +++ b/packages/theme/composables/useCurrency/index.ts @@ -13,7 +13,11 @@ import type { UseCurrencyChangeParams, } from './useCurrency'; -/** The `useCurrency()` composable allows loading and changing the currency. */ +/** + * The `useCurrency()` composable allows loading and changing the currency. + * + * See the {@link UseCurrencyInterface} for a list of methods and values available in this composable. + */ export function useCurrency(): UseCurrencyInterface { const { app } = useContext(); const loading = ref(false); diff --git a/packages/theme/composables/useCurrency/useCurrency.ts b/packages/theme/composables/useCurrency/useCurrency.ts index 2426f1be2..c968c911c 100644 --- a/packages/theme/composables/useCurrency/useCurrency.ts +++ b/packages/theme/composables/useCurrency/useCurrency.ts @@ -3,32 +3,52 @@ import type { ComposableFunctionArgs } from '~/composables/types'; import type { Currency } from '~/modules/GraphQL/types'; /** - * The {@link useCurrency} error object. The properties values' are the errors - * thrown by its methods. + * Errors that occured in the {@link useCurrency|useCurrency()} composable */ export interface UseCurrencyErrors { - /** Error when loading the currency fails, otherwise is `null`. */ + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; - /** Error when changing the currency fails, otherwise is `null`. */ + /** + * Contains error if `change` method failed, otherwise is `null` + */ change: Error | null; } -/** The params received by {@link useCurrency}'s `load` method. */ +/** + * The params object accepted by the `load` method in the {@link useCurrency|useCurrency()} composable + */ export type UseCurrencyLoadParams = ComposableFunctionArgs<{}>; -/** The params received by {@link useCurrency}'s `change` method. */ +/** + * The params object accepted by the `change` method in the {@link useCurrency|useCurrency()} composable + */ export type UseCurrencyChangeParams = { id: string }; -/** The interface provided by {@link useCurrency} composable. */ +/** + * The refs and methods returned by the {@link useCurrency|useCurrency()} composable + */ export interface UseCurrencyInterface { - /** Loads the currency and updates the configuration store. */ + /** + * Loads the currency and updates the configuration store + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#currency} API endpoint + * and accepts the custom queries named `currency`. + */ load(params?: UseCurrencyLoadParams): Promise; - /** Changes the currency and reloads the page. */ + /** + * Changes the currency and reloads the page + */ change(params: UseCurrencyChangeParams): void; - /** Contains errors from any of the composable methods. */ + /** + * Contains errors from the composable methods + */ error: DeepReadonly>; /** @@ -38,6 +58,8 @@ export interface UseCurrencyInterface { */ currency: ComputedRef; - /** Indicates whether any of the composable methods is in progress. */ + /** + * Indicates whether any of the methods is in progress + */ loading: Readonly>; } diff --git a/packages/theme/composables/useExternalCheckout/index.ts b/packages/theme/composables/useExternalCheckout/index.ts index 54c5dd549..ea54f6e6c 100644 --- a/packages/theme/composables/useExternalCheckout/index.ts +++ b/packages/theme/composables/useExternalCheckout/index.ts @@ -1,12 +1,11 @@ import { readonly, ref, useContext } from '@nuxtjs/composition-api'; import { Logger } from '~/helpers/logger'; -import { UseExternalCheckoutInterface } from '~/composables/useExternalCheckout/useExternalCheckout'; +import type { UseExternalCheckoutInterface } from '~/composables/useExternalCheckout/useExternalCheckout'; /** - * The `useExternalCheckout` composable is responsible for - * redirecting checkout process and depends on {@link https://github.com/Vendic/magento2-external-checkout | Magento 2 External Checkout for Vue Storefront} repository. + * The `useExternalCheckout` composable allows redirecting to external checkout process. It depends on the {@link https://github.com/Vendic/magento2-external-checkout | magento2-external-checkout repository}. * - * See the {@link UseExternalCheckoutInterface} page for more information. + * See the {@link UseExternalCheckoutInterface} for a list of methods and values available in this composable. */ export function useExternalCheckout(): UseExternalCheckoutInterface { const { app } = useContext(); diff --git a/packages/theme/composables/useExternalCheckout/useExternalCheckout.ts b/packages/theme/composables/useExternalCheckout/useExternalCheckout.ts index 54f8b8af5..9dfa9ae01 100644 --- a/packages/theme/composables/useExternalCheckout/useExternalCheckout.ts +++ b/packages/theme/composables/useExternalCheckout/useExternalCheckout.ts @@ -1,14 +1,27 @@ import { DeepReadonly, Ref } from '@nuxtjs/composition-api'; import { ComposableFunctionArgs } from '~/composables/types'; +/** + * The params object accepted by the `initializeCheckout` method in the {@link useExternalCheckout|useExternalCheckout()} composable + */ export type UseExternalCheckoutInitializeParams = ComposableFunctionArgs<{ baseUrl: string }>; -/** Represents the data and methods returned by the {@link useExternalCheckout} composable */ +/** + * The refs and methods returned by the {@link useExternalCheckout|useExternalCheckout()} composable + */ export interface UseExternalCheckoutInterface { - /** Initializes the checkout provider with the `baseUrl` */ + /** + * Initializes the checkout provider with the `baseUrl` + */ initializeCheckout(params: UseExternalCheckoutInitializeParams): string - /** Returns the loading state as a computed boolean */ + + /** + * Indicates whether any of the methods is in progress + */ loading: DeepReadonly>, - /** Returns errors when intializing the checkout */ + + /** + * Contains errors from the composable methods + */ error: DeepReadonly>, } diff --git a/packages/theme/composables/useImage/index.ts b/packages/theme/composables/useImage/index.ts index 36d2c8264..6117abcd0 100644 --- a/packages/theme/composables/useImage/index.ts +++ b/packages/theme/composables/useImage/index.ts @@ -3,9 +3,9 @@ import imageSizes from '~/enums/imageEnums'; import { UseImageInterface } from './useImage'; /** - * The `useImage` composable allows to extract an image path from magento URL + * The `useImage` composable allows extracting image paths from magento URL. * - * See {@link UseImageInterface} page for more details + * See the {@link UseImageInterface} for a list of methods and values available in this composable. * */ export function useImage(): UseImageInterface { // @ts-ignore diff --git a/packages/theme/composables/useImage/useImage.ts b/packages/theme/composables/useImage/useImage.ts index cb3285542..0d73099d1 100644 --- a/packages/theme/composables/useImage/useImage.ts +++ b/packages/theme/composables/useImage/useImage.ts @@ -23,10 +23,17 @@ export type ImageSizes = { }, }; -/** Represent data and methods returned by the {@link useImage} composable */ +/** + * The refs and methods returned by the {@link useImage|useImage()} composable + */ export interface UseImageInterface { - /** Extract image path from Magento URL. */ - getMagentoImage (fullImageUrl: string): string - /** Available image sizes */ + /** + * Extracts image path from Magento URL. + */ + getMagentoImage(fullImageUrl: string): string + + /** + * Available image sizes + */ imageSizes: ImageSizes } diff --git a/packages/theme/composables/useMagentoConfiguration/UseMagentoConfiguration.ts b/packages/theme/composables/useMagentoConfiguration/UseMagentoConfiguration.ts index 4f9316d1d..513b4d0be 100644 --- a/packages/theme/composables/useMagentoConfiguration/UseMagentoConfiguration.ts +++ b/packages/theme/composables/useMagentoConfiguration/UseMagentoConfiguration.ts @@ -1,17 +1,27 @@ import type { ComputedRef } from '@nuxtjs/composition-api'; import type { StoreConfig } from '~/../api-client/lib'; -/** The interface provided by {@link useMagentoConfiguration} composable. */ +/** + * The refs and methods returned by the {@link useMagentoConfiguration|useMagentoConfiguration()} composable + */ export interface UseMagentoConfigurationInterface { - /** The store configuration object. */ + /** + * Store configuration object. + */ storeConfig: ComputedRef; - /** The selected currency. */ + /** + * Currently active currency + */ selectedCurrency: ComputedRef; - /** The selected locale. */ + /** + * Currently active locale + */ selectedLocale: ComputedRef; - /** The selected store. */ + /** + * Currently active store + */ selectedStore: ComputedRef; } diff --git a/packages/theme/composables/useMagentoConfiguration/index.ts b/packages/theme/composables/useMagentoConfiguration/index.ts index c3863cd75..d8880ad9a 100644 --- a/packages/theme/composables/useMagentoConfiguration/index.ts +++ b/packages/theme/composables/useMagentoConfiguration/index.ts @@ -5,6 +5,8 @@ import type { UseMagentoConfigurationInterface } from './UseMagentoConfiguration /** * The `useMagentoConfiguration()` composable allows getting the Magento's major * definitions, e.g., the selected currency, store, locale, and config object. + * + * See the {@link UseMagentoConfigurationInterface} for a list of methods and values available in this composable. */ export function useMagentoConfiguration(): UseMagentoConfigurationInterface { const { diff --git a/packages/theme/composables/useNewsletter/index.ts b/packages/theme/composables/useNewsletter/index.ts index d292d6084..40d5ae9e1 100644 --- a/packages/theme/composables/useNewsletter/index.ts +++ b/packages/theme/composables/useNewsletter/index.ts @@ -11,6 +11,8 @@ import type { /** * The `useNewsletter()` composable allows updating the subscription status of * an email in the newsletter. + * + * See the {@link UseNewsletterInterface} for a list of methods and values available in this composable. */ export function useNewsletter(): UseNewsletterInterface { const context = useContext(); diff --git a/packages/theme/composables/useNewsletter/useNewsletter.ts b/packages/theme/composables/useNewsletter/useNewsletter.ts index 47b915123..eb227ed99 100644 --- a/packages/theme/composables/useNewsletter/useNewsletter.ts +++ b/packages/theme/composables/useNewsletter/useNewsletter.ts @@ -3,33 +3,38 @@ import type { ComposableFunctionArgs } from '~/composables/types'; import type { SubscriptionStatusesEnum } from '~/modules/GraphQL/types'; /** - * The {@link useNewsletter} error object. The properties values' are the errors - * thrown by its methods. + * Errors that occured in the {@link useNewsletter|useNewsletter()} composable */ export interface UseNewsletterErrors { - /** Error when updating subscription fails, otherwise is `null`. */ + /** + * Contains error if `updateSubscription` method failed, otherwise is `null` + */ updateSubscription: Error | null; } /** - * The params received by {@link useNewsletter}'s `updateSubscription` method. + * The params object accepted by the `updateSubscription` method in the {@link useNewsletter|useNewsletter()} composable */ export type UseNewsletterUpdateSubscriptionParams = ComposableFunctionArgs<{ email: string; }>; -/** The interface provided by {@link useNewsletter} composable. */ +/** + * The refs and methods returned by the {@link useNewsletter|useNewsletter()} composable + */ export interface UseNewsletterInterface { - /** Updates subscription status of an email in the newsletter. */ + /** + * Updates subscription status of an email in the newsletter + */ updateSubscription(params: UseNewsletterUpdateSubscriptionParams): Promise; /** - * Contains errors from any of the composable methods. - * - * Read {@link UseNewsletterErrors} documentation for more details. + * Contains errors from the composable methods */ error: DeepReadonly>; - /** Indicates whether any of the composable methods is in progress. */ + /** + * Indicates whether any of the methods is in progress + */ loading: Readonly>; } diff --git a/packages/theme/composables/useReview/index.ts b/packages/theme/composables/useReview/index.ts index db8bdd58f..1a06ada2d 100644 --- a/packages/theme/composables/useReview/index.ts +++ b/packages/theme/composables/useReview/index.ts @@ -15,7 +15,7 @@ import type { /** * The `useReview()` composable allows loading and adding product reviews * - * See the {@link UseReviewInterface} page for more information. + * See the {@link UseReviewInterface} for a list of methods and values available in this composable. */ export function useReview(): UseReviewInterface { const loading = ref(false); diff --git a/packages/theme/composables/useReview/useReview.ts b/packages/theme/composables/useReview/useReview.ts index b3392f1cb..7cb0eb3ad 100644 --- a/packages/theme/composables/useReview/useReview.ts +++ b/packages/theme/composables/useReview/useReview.ts @@ -1,7 +1,6 @@ import type { Ref, DeepReadonly } from '@nuxtjs/composition-api'; import type { ComposableFunctionArgs } from '~/composables/types'; import type { GetProductSearchParams } from '~/modules/catalog/product/types'; - import type { CreateProductReviewInput, ProductReviewQuery, @@ -11,46 +10,81 @@ import type { } from '~/modules/GraphQL/types'; /** - * Errors that occured in the `useReview` composable + * Errors that occured in the {@link useReview|useReview()} composable */ export interface UseReviewErrors { + /** + * Contains error if `search` method failed, otherwise is `null` + */ search: Error; + + /** + * Contains error if `addReview` method failed, otherwise is `null` + */ addReview: Error; + + /** + * Contains error if `loadReviewMetadata` method failed, otherwise is `null` + */ loadReviewMetadata: Error; + + /** + * Contains error if `loadCustomerReviews` method failed, otherwise is `null` + */ loadCustomerReviews: Error; } /** - * Parameters accepted by the `search` method in the `useReview` composable + * The params object accepted by the `search` method in the {@link useReview|useReview()} composable */ export type UseReviewSearchParams = ComposableFunctionArgs; /** - * Parameters accepted by the `addReview` method in the `useReview` composable + * The params object accepted by the `addReview` method in the {@link useReview|useReview()} composable */ export type UseReviewAddReviewParams = ComposableFunctionArgs; /** - * Represents the data returned from and functions available in the `useReview()` composable. + * The refs and methods returned by the {@link useCountrySearch|useCountrySearch()} composable */ export interface UseReviewInterface { /** * Fetches reviews for the product matching the provided filters + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#productReview} API endpoint + * and accepts the custom queries named `productReview`. */ search(params: UseReviewSearchParams): Promise; /** * Fetches product reviews created by the current customer + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#customerProductReview} API endpoint + * and accepts the custom queries named `reviews`. */ loadCustomerReviews(): Promise; /** * Fetches additional product reviews data + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#productReviewRatingsMetadata} API endpoint + * and accepts the custom queries named `productReviewRatingsMetadata`. */ loadReviewMetadata(): Promise; /** * Submits a new product review + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#createProductReview} API endpoint + * and accepts the custom queries named `createProductReview`. */ addReview(params: UseReviewAddReviewParams): Promise; diff --git a/packages/theme/composables/useStore/index.ts b/packages/theme/composables/useStore/index.ts index eee92ff79..978f4806e 100644 --- a/packages/theme/composables/useStore/index.ts +++ b/packages/theme/composables/useStore/index.ts @@ -13,7 +13,7 @@ import type { UseStoreInterface, UseStoreErrors } from '~/composables/useStore/u /** * The `useStore()` composable allows loading and changing currently active store * - * See the {@link UseStoreInterface} page for more information. + * See the {@link UseStoreInterface} for a list of methods and values available in this composable. */ export function useStore(): UseStoreInterface { const loading: Ref = ref(false); diff --git a/packages/theme/composables/useStore/useStore.ts b/packages/theme/composables/useStore/useStore.ts index f25049ce0..4e43ae503 100644 --- a/packages/theme/composables/useStore/useStore.ts +++ b/packages/theme/composables/useStore/useStore.ts @@ -3,15 +3,22 @@ import type { StoreConfig } from '~/modules/GraphQL/types'; import type { AvailableStores } from '~/composables/types'; /** - * Errors that occured in the `useStore` composable + * Errors that occured in the {@link useStore|useStore()} composable */ export interface UseStoreErrors { + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; + + /** + * Contains error if `change` method failed, otherwise is `null` + */ change: Error | null; } /** - * Represents the data returned from and functions available in the `useStore()` composable. + * The refs and methods returned by the {@link useStore|useStore()} composable */ export interface UseStoreInterface { /** @@ -21,6 +28,11 @@ export interface UseStoreInterface { /** * Fetches a list of available stores + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#availableStores} API endpoint + * and accepts the custom queries named `availableStores`. */ load(customQuery?: { availableStores: string }): Promise; @@ -35,7 +47,7 @@ export interface UseStoreInterface { loading: DeepReadonly>; /** - * Contains errors from any of the composable methods + * Contains errors from the composable methods */ error: DeepReadonly>; } diff --git a/packages/theme/composables/useUiHelpers/index.ts b/packages/theme/composables/useUiHelpers/index.ts index e618370d4..fa5130d7b 100644 --- a/packages/theme/composables/useUiHelpers/index.ts +++ b/packages/theme/composables/useUiHelpers/index.ts @@ -20,6 +20,8 @@ function reduceFilters(query: QueryParams) { /** * The `useUiHelpers()` composable allows handling the parameters for filtering, * searching, sorting and pagination in the URL search/query params. + * + * See the {@link UseUiHelpersInterface} for a list of methods and values available in this composable. */ export function useUiHelpers(): UseUiHelpersInterface { const route = useRoute(); diff --git a/packages/theme/composables/useUiNotification/index.ts b/packages/theme/composables/useUiNotification/index.ts index c16d7866b..3197d760d 100644 --- a/packages/theme/composables/useUiNotification/index.ts +++ b/packages/theme/composables/useUiNotification/index.ts @@ -17,7 +17,7 @@ const timeToLive = 3000; /** * The `useUiNotification()` composable allows showing notifications to the user. * - * See the {@link UseUiNotificationInterface} page for more information. + * See the {@link UseUiNotificationInterface} for a list of methods and values available in this composable. */ export function useUiNotification(): UseUiNotificationInterface { const { app } = useContext(); diff --git a/packages/theme/composables/useUiState/index.ts b/packages/theme/composables/useUiState/index.ts index 27f06019d..a69809bf9 100644 --- a/packages/theme/composables/useUiState/index.ts +++ b/packages/theme/composables/useUiState/index.ts @@ -15,7 +15,7 @@ const state = reactive({ /** * The `useUiState()` composable is a global store for managing UI state * - * See the {@link UseUiStateInterface} page for more information. + * See the {@link UseUiStateInterface} for a list of methods and values available in this composable. */ export function useUiState(): UseUiStateInterface { const toggleMobileMenu = () => { diff --git a/packages/theme/composables/useUrlResolver/UseUrlResolver.ts b/packages/theme/composables/useUrlResolver/UseUrlResolver.ts index 524010c3e..bc91c8a2b 100644 --- a/packages/theme/composables/useUrlResolver/UseUrlResolver.ts +++ b/packages/theme/composables/useUrlResolver/UseUrlResolver.ts @@ -2,32 +2,36 @@ import type { DeepReadonly, Ref } from '@nuxtjs/composition-api'; import type { EntityUrl } from '~/modules/GraphQL/types'; /** - * The {@link useUrlResolver} error object. The properties values' are the - * errors thrown by its methods. + * Errors that occured in the {@link UseUrlResolverErrors|UseUrlResolverErrors()} composable */ export interface UseUrlResolverErrors { /** - * Error when searching the resolver for current route URL fails, otherwise is - * `null`. + * Contains error if `search` method failed, otherwise is `null` */ search: Error | null; } -/** The interface provided by {@link useUrlResolver} composable. */ +/** + * The refs and methods returned by the {@link useUrlResolver|useUrlResolver()} composable + */ export interface UseUrlResolverInterface { - /** The current route path. */ + /** + * The current route path + */ path: string; /** - * Contains errors from any of the composable methods. - * - * @see {@link UseUrlResolverErrors} documentation for more details. + * Contains errors from the composable methods */ error: DeepReadonly>; - /** Indicates whether any of the composable methods is in progress. */ + /** + * Indicates whether any of the methods is in progress + */ loading: Readonly>; - /** Searches the resolver for current route URL. */ + /** + * Searches the resolver for current route URL + */ search(): Promise; } diff --git a/packages/theme/composables/useUrlResolver/index.ts b/packages/theme/composables/useUrlResolver/index.ts index 3f3c8d1c7..f93ecdf0f 100644 --- a/packages/theme/composables/useUrlResolver/index.ts +++ b/packages/theme/composables/useUrlResolver/index.ts @@ -11,6 +11,8 @@ import type { UseUrlResolverErrors, UseUrlResolverInterface } from './UseUrlReso /** * The `useUrlResolver()` composable allows searching the resolver for current * route path (URL). + * + * See the {@link UseUrlResolverInterface} for a list of methods and values available in this composable. */ export function useUrlResolver(): UseUrlResolverInterface { const route = useRoute(); diff --git a/packages/theme/modules/catalog/category/composables/useCategorySearch/index.ts b/packages/theme/modules/catalog/category/composables/useCategorySearch/index.ts index e74aad84d..88c495211 100644 --- a/packages/theme/modules/catalog/category/composables/useCategorySearch/index.ts +++ b/packages/theme/modules/catalog/category/composables/useCategorySearch/index.ts @@ -4,8 +4,10 @@ import type { CategorySearchQueryVariables, CategoryTree } from '~/modules/Graph import type { UseCategorySearchErrors, UseCategorySearchInterface } from './useCategorySearch'; /** - * The `useCategorySearch()` composable allows searching for categories. It is + * The `useCategorySearch` composable allows searching for categories. It is * commonly used in subtrees navigation. + * + * See the {@link UseCategorySearchInterface} for a list of methods and values available in this composable. */ export function useCategorySearch(): UseCategorySearchInterface { const { app } = useContext(); diff --git a/packages/theme/modules/catalog/category/composables/useCategorySearch/useCategorySearch.ts b/packages/theme/modules/catalog/category/composables/useCategorySearch/useCategorySearch.ts index 083a8177e..3839e2bd2 100644 --- a/packages/theme/modules/catalog/category/composables/useCategorySearch/useCategorySearch.ts +++ b/packages/theme/modules/catalog/category/composables/useCategorySearch/useCategorySearch.ts @@ -3,18 +3,23 @@ import type { CategorySearchQueryVariables, CategoryTree } from '~/modules/Graph import type { ComposableFunctionArgs } from '~/composables/types'; /** - * The {@link useCategorySearch} error object. The properties values' are the - * errors thrown by its methods. + * Errors that occured in the {@link useCategorySearch|useCategorySearch()} composable */ export interface UseCategorySearchErrors { - /** Error when searching for categories fails, otherwise is `null`. */ + /** + * Contains error if `search` method failed, otherwise is `null` + */ search: Error | null; } -/** The params received by {@link useCategorySearch}'s `search` method. */ +/** + * The params object accepted by the `search` method in the {@link useCategorySearch|useCategorySearch()} composable + */ export type UseCategorySearchParams = ComposableFunctionArgs; -/** The interface provided by {@link useCategorySearch} composable. */ +/** + * The refs and methods returned by the {@link useCategorySearch|useCategorySearch()} composable + */ export interface UseCategorySearchInterface { /** * Searches for categories using the received filters and updates the @@ -22,7 +27,9 @@ export interface UseCategorySearchInterface { */ search(searchParams: UseCategorySearchParams): Promise; - /** Contains errors from any of the composable methods. */ + /** + * Contains errors from the composable methods + */ error: DeepReadonly>; /** @@ -31,6 +38,8 @@ export interface UseCategorySearchInterface { */ result: DeepReadonly>; - /** Indicates whether any of the composable methods is in progress. */ + /** + * Indicates whether any of the methods is in progress + */ loading: Readonly>; } diff --git a/packages/theme/modules/checkout/composables/useBilling/useBilling.ts b/packages/theme/modules/checkout/composables/useBilling/useBilling.ts index 994231485..cfdf2fae1 100644 --- a/packages/theme/modules/checkout/composables/useBilling/useBilling.ts +++ b/packages/theme/modules/checkout/composables/useBilling/useBilling.ts @@ -3,7 +3,7 @@ import type { BillingCartAddress } from '~/modules/GraphQL/types'; import { ComposableFunctionArgs } from '~/composables/types'; /** - * The object used by {@link useBilling|useBilling()} to save new billing information. + * The object used by the {@link useBilling|useBilling()} composable to save new billing information */ export interface BillingDetails { apartment?: string; @@ -22,26 +22,35 @@ export interface BillingDetails { } /** - * The {@link useBilling} error object. The properties values' are the errors - * thrown by its methods. + * Errors that occured in the {@link useBilling|useBilling()} composable */ export interface UseBillingError { - /** Error when loading the billing information fails, otherwise is `null`. */ + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; - /** Error when saving the billing information fails, otherwise is `null`. */ + /** + * Contains error if `save` method failed, otherwise is `null` + */ save: Error | null; } -/** The params received by {@link useBilling}'s `load` method. */ +/** + * The params object accepted by the `load` method in the {@link useBilling|useBilling()} composable + */ export type UseBillingLoadParams = ComposableFunctionArgs<{}>; -/** The params received by {@link useBilling}'s `save` method. */ +/** + * The params object accepted by the `save` method in the {@link useBilling|useBilling()} composable + */ export interface UseBillingSaveParams { billingDetails: BillingDetails; } -/** The interface provided by {@link useBilling} composable. */ +/** + * The refs and methods returned by the {@link useBilling|useBilling()} composable + */ export interface UseBillingInterface { /** * Loads the billing information. It returns a `Promise` that resolves into @@ -55,9 +64,13 @@ export interface UseBillingInterface { */ save(params: UseBillingSaveParams): Promise; - /** Contains errors from any of the composable methods. */ + /** + * Contains errors from the composable methods + */ error: Readonly>; - /** Indicates whether any of the methods is in progress. */ + /** + * Indicates whether any of the methods is in progress + */ loading: Readonly>; } diff --git a/packages/theme/modules/checkout/composables/useShippingProvider/index.ts b/packages/theme/modules/checkout/composables/useShippingProvider/index.ts index ccd43afe6..a455fbe5c 100644 --- a/packages/theme/modules/checkout/composables/useShippingProvider/index.ts +++ b/packages/theme/modules/checkout/composables/useShippingProvider/index.ts @@ -11,9 +11,11 @@ import type { } from './useShippingProvider'; /** - * The `useShippingProvider()` composable allows loading the shipping provider + * The `useShippingProvider` composable allows loading the shipping provider * for the current cart and saving (selecting) other shipping provider for the * same cart. + * + * See the {@link UseShippingProviderInterface} for a list of methods and values available in this composable. */ export function useShippingProvider(): UseShippingProviderInterface { const loading = ref(false); diff --git a/packages/theme/modules/checkout/composables/useShippingProvider/useShippingProvider.ts b/packages/theme/modules/checkout/composables/useShippingProvider/useShippingProvider.ts index e7d3642c2..7c9e53b0e 100644 --- a/packages/theme/modules/checkout/composables/useShippingProvider/useShippingProvider.ts +++ b/packages/theme/modules/checkout/composables/useShippingProvider/useShippingProvider.ts @@ -3,41 +3,59 @@ import type { SelectedShippingMethod } from '~/modules/GraphQL/types'; import type { ComposableFunctionArgs } from '~/composables/types'; /** - * The {@link useShippingProvider} error object. The properties values' are the - * errors thrown by its methods. + * Errors that occured in the {@link useShippingProvider|useShippingProvider()} composable */ export interface UseShippingProviderErrors { - /** Error when loading the shipping provider fails, otherwise is `null`. */ + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; - /** Error when saving new shipping provider fails, otherwise is `null`. */ + /** + * Contains error if `save` method failed, otherwise is `null` + */ save: Error | null; } -/** The params received by {@link useShippingProvider}'s `load` method. */ +/** + * The params object accepted by the `load` method in the {@link useShippingProvider|useShippingProvider()} composable + */ export type UseShippingProviderLoadParams = ComposableFunctionArgs<{}>; -/** The params received by {@link useShippingProvider}'s `save` method. */ +/** + * The params object accepted by the `save` method in the {@link useShippingProvider|useShippingProvider()} composable + */ export type UseShippingProviderSaveParams = ComposableFunctionArgs<{ // TODO: Define this type. shippingMethod: any; }>; -/** The interface provided by {@link useShippingProvider} composable. */ +/** + * The refs and methods returned by the {@link useShippingProvider|useShippingProvider()} composable + */ export interface UseShippingProviderInterface { /** - * Contains errors from any of the composable methods. - * - * @see {@link UseShippingProviderErrors} documentation for more details. + * Contains errors from the composable methods */ error: Readonly>; - /** Indicates whether any of the composable methods is in progress. */ + /** + * Indicates whether any of the methods is in progress + */ loading: Readonly>; - /** Loads the shipping provider for current cart. */ + /** + * Loads the shipping provider for current cart + */ load(params?: UseShippingProviderLoadParams): Promise; - /** Save new shipping provider for current cart. */ + /** + * Save new shipping provider for current cart + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#setShippingMethodsOnCart} API endpoint + * and accepts the custom queries named `setShippingMethodsOnCart`. + */ save(params: UseShippingProviderSaveParams): Promise; } diff --git a/packages/theme/modules/customer/composables/useAddresses/useAddresses.ts b/packages/theme/modules/customer/composables/useAddresses/useAddresses.ts index f7e430d09..3b017ff11 100644 --- a/packages/theme/modules/customer/composables/useAddresses/useAddresses.ts +++ b/packages/theme/modules/customer/composables/useAddresses/useAddresses.ts @@ -4,52 +4,38 @@ import type { CustomerAddress } from '~/modules/GraphQL/types'; /** * Errors that occured in the {@link useAddresses|useAddresses()} composable - * - * @example - * - * Check if removing a customer address failed: - * - * ```typescript - * import { useAddresses } from '~/modules/customer/composables/useAddresses'; - * - * export default { - * setup(props) { - * const { error, remove } = useAddresses(); - * - * const onRemove = async (address: CustomerAddress) => { - * await remove(address); - * - * if (error.value.remove) { - * // handle removing error - * } - * }; - * - * return { onRemove }; - * } - * } - * ``` */ export interface UseAddressesErrors { - /** Error when loading customer addresses fails, otherwise is `null`. */ + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; - /** Error when saving a new customer address fails, otherwise is `null`. */ + /** + * Contains error if `save` method failed, otherwise is `null` + */ save: Error | null; - /** Error when removing a customer address fails, otherwise is `null`. */ + /** + * Contains error if `remove` method failed, otherwise is `null` + */ remove: Error | null; - /** Error when updating a customer address fails, otherwise is `null`. */ + /** + * Contains error if `update` method failed, otherwise is `null` + */ update: Error | null; } -/** The params object required to **save**, **update** or **remove** a customer address. */ +/** + * The params object accepted by the `save`, `update` and `remove` methods in the {@link useAddresses|useAddresses()} composable + */ export interface UseAddressesParamsInput { address: CustomerAddress; } /** - * The refs and methods returned by the {@link useAddresses|useAddresses()} composable. + * The refs and methods returned by the {@link useAddresses|useAddresses()} composable */ export interface UseAddressesInterface { /** diff --git a/packages/theme/modules/customer/composables/useUserAddress/index.ts b/packages/theme/modules/customer/composables/useUserAddress/index.ts index f700c9533..512a461f4 100644 --- a/packages/theme/modules/customer/composables/useUserAddress/index.ts +++ b/packages/theme/modules/customer/composables/useUserAddress/index.ts @@ -19,7 +19,7 @@ import type { /** * The `useUserAddress()` composable allows loading and manipulating addresses of the current user. * - * See the {@link UseUserAddressInterface} page for more information. + * See the {@link UseUserAddressInterface} for a list of methods and values available in this composable. */ export function useUserAddress(): UseUserAddressInterface { const loading = ref(false); diff --git a/packages/theme/modules/customer/composables/useUserAddress/useUserAddress.ts b/packages/theme/modules/customer/composables/useUserAddress/useUserAddress.ts index 489e3d817..4e5770fe3 100644 --- a/packages/theme/modules/customer/composables/useUserAddress/useUserAddress.ts +++ b/packages/theme/modules/customer/composables/useUserAddress/useUserAddress.ts @@ -4,53 +4,87 @@ import type { ComposableFunctionArgs } from '~/composables/types'; import { Customer } from '~/modules/GraphQL/types'; /** - * Errors that occured in the `useUserAddress` composable + * Errors that occured in the {@link UseUserAddressErrors|UseUserAddressErrors()} composable */ export interface UseUserAddressErrors { + /** + * Contains error if `addAddress` method failed, otherwise is `null` + */ addAddress: Error | null; + + /** + * Contains error if `deleteAddress` method failed, otherwise is `null` + */ deleteAddress: Error | null; + + /** + * Contains error if `updateAddress` method failed, otherwise is `null` + */ updateAddress: Error | null; + + /** + * Contains error if `load` method failed, otherwise is `null` + */ load: Error | null; + + /** + * Contains error if `setDefaultAddress` method failed, otherwise is `null` + */ setDefaultAddress: Error | null; } /** - * Parameters accepted by the `addAddress` method in the `useUserAddress` composable + * The params object accepted by the `addAddress` method in the {@link useUserAddress|useUserAddress()} composable */ export type UseUserAddressAddAddressParams = ComposableFunctionArgs<{ address: CustomerAddress; }>; /** - * Parameters accepted by the `updateAddress` method in the `useUserAddress` composable + * The params object accepted by the `updateAddress` method in the {@link useUserAddress|useUserAddress()} composable */ export type UseUserAddressUpdateAddressParams = ComposableFunctionArgs<{ address: CustomerAddress; }>; /** - * Parameters accepted by the `setDefaultAddress` method in the `useUserAddress` composable + * The params object accepted by the `setDefaultAddress` method in the {@link useUserAddress|useUserAddress()} composable */ export type UseUserAddressSetDefaultAddressParams = ComposableFunctionArgs<{ address: CustomerAddress; }>; /** - * Represents the data returned from and functions available in the `useUserAddress()` composable. + * The refs and methods returned by the {@link useUserAddress|useUserAddress()} composable */ export interface UseUserAddressInterface { /** * Adds address to the profile of the current user + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#createCustomerAddress} API endpoint + * and accepts the custom queries named `createCustomerAddress`. */ addAddress(params: UseUserAddressAddAddressParams): Promise; /** * Deletes address from the profile of the current user + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#deleteCustomerAddress} API endpoint + * and accepts the custom queries named `deleteCustomerAddress`. */ deleteAddress(address: CustomerAddress): Promise; // TODO: Should accept custom queries /** * Updates an existing address from the profile of the current user + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#updateCustomerAddress} API endpoint + * and accepts the custom queries named `updateCustomerAddress`. */ updateAddress(params: UseUserAddressUpdateAddressParams): Promise; @@ -61,6 +95,11 @@ export interface UseUserAddressInterface { /** * Sets an existing address as the default for the current user + * + * @remarks + * + * Internally, it calls the {@link @vue-storefront/magento-api#updateCustomerAddress} API endpoint + * and accepts the custom queries named `updateCustomerAddress`. */ setDefaultAddress(params: UseUserAddressSetDefaultAddressParams): Promise; From 660fcea85f137d57745020c2326776eb301d5720 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Fri, 13 May 2022 16:02:06 +0200 Subject: [PATCH 378/486] docs: update composable navigation --- docs/.vuepress/config.js | 70 ++++++++++++++++++++-------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 8173d1061..8e448295a 100755 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -88,41 +88,41 @@ module.exports = { { title: 'Composables', children: [ - ['/api-reference/magento-theme.useaddresses', 'useAddresses()'], - ['/api-reference/magento-theme.useapi', 'useApi()'], - ['/api-reference/magento-theme.usebilling', 'useBilling()'], - ['/api-reference/magento-theme.usecart', 'useCart() [Deprecated]'], - ['/api-reference/magento-theme.usecategory', 'useCategory() [Deprecated]'], - ['/api-reference/magento-theme.usecategorysearch', 'useCategorySearch()'], - ['/api-reference/magento-theme.useconfig', 'useConfig()'], - ['/api-reference/magento-theme.usecontent', 'useContent()'], - ['/api-reference/magento-theme.usecountrysearch', 'useCountrySearch()'], - ['/api-reference/magento-theme.usecurrency', 'useCurrency()'], - ['/api-reference/magento-theme.useexternalcheckout', 'useExternalCheckout()'], - ['/api-reference/magento-theme.usefacet', 'useFacet() [Deprecated]'], - ['/api-reference/magento-theme.useforgotpassword', 'useForgotPassword() [Deprecated]'], - ['/api-reference/magento-theme.usegetshippingmethods', 'useGetShippingMethods() [Deprecated]'], - ['/api-reference/magento-theme.useguestuser', 'useGuestUser() [Deprecated]'], - ['/api-reference/magento-theme.useimage', 'useImage()'], - ['/api-reference/magento-theme.usemagentoconfiguration', 'useMagentoConfiguration()'], - ['/api-reference/magento-theme.usemakeorder', 'useMakeOrder() [Deprecated]'], - ['/api-reference/magento-theme.usenewsletter', 'useNewsletter()'], - ['/api-reference/magento-theme.usepaymentprovider', 'usePaymentProvider() [Deprecated]'], - ['/api-reference/magento-theme.useproduct', 'useProduct() [Deprecated]'], - ['/api-reference/magento-theme.userelatedproducts', 'useRelatedProducts() [Deprecated]'], - ['/api-reference/magento-theme.usereview', 'useReview()'], - ['/api-reference/magento-theme.useshipping', 'useShipping() [Deprecated]'], - ['/api-reference/magento-theme.useshippingprovider', 'useShippingProvider()'], - ['/api-reference/magento-theme.usestore', 'useStore()'], - ['/api-reference/magento-theme.useuihelpers', 'useUiHelpers()'], - ['/api-reference/magento-theme.useuinotification', 'useUiNotification()'], - ['/api-reference/magento-theme.useuistate', 'useUiState()'], - ['/api-reference/magento-theme.useupsellproducts', 'useUpsellProducts() [Deprecated]'], - ['/api-reference/magento-theme.useurlresolver', 'useUrlResolver()'], - ['/api-reference/magento-theme.useuser', 'useUser() [Deprecated]'], - ['/api-reference/magento-theme.useuseraddress', 'useUserAddress()'], - ['/api-reference/magento-theme.useuserorder', 'useUserOrder() [Deprecated]'], - ['/api-reference/magento-theme.usewishlist', 'useWishlist() [Deprecated]'], + ['/api-reference/magento-theme.useaddresses', 'useAddresses'], + ['/api-reference/magento-theme.useapi', 'useApi'], + ['/api-reference/magento-theme.usebilling', 'useBilling'], + ['/api-reference/magento-theme.usecart', 'useCart [Deprecated]'], + ['/api-reference/magento-theme.usecategory', 'useCategory [Deprecated]'], + ['/api-reference/magento-theme.usecategorysearch', 'useCategorySearch'], + ['/api-reference/magento-theme.useconfig', 'useConfig'], + ['/api-reference/magento-theme.usecontent', 'useContent'], + ['/api-reference/magento-theme.usecountrysearch', 'useCountrySearch'], + ['/api-reference/magento-theme.usecurrency', 'useCurrency'], + ['/api-reference/magento-theme.useexternalcheckout', 'useExternalCheckout'], + ['/api-reference/magento-theme.usefacet', 'useFacet [Deprecated]'], + ['/api-reference/magento-theme.useforgotpassword', 'useForgotPassword [Deprecated]'], + ['/api-reference/magento-theme.usegetshippingmethods', 'useGetShippingMethods [Deprecated]'], + ['/api-reference/magento-theme.useguestuser', 'useGuestUser [Deprecated]'], + ['/api-reference/magento-theme.useimage', 'useImage'], + ['/api-reference/magento-theme.usemagentoconfiguration', 'useMagentoConfiguration'], + ['/api-reference/magento-theme.usemakeorder', 'useMakeOrder [Deprecated]'], + ['/api-reference/magento-theme.usenewsletter', 'useNewsletter'], + ['/api-reference/magento-theme.usepaymentprovider', 'usePaymentProvider [Deprecated]'], + ['/api-reference/magento-theme.useproduct', 'useProduct [Deprecated]'], + ['/api-reference/magento-theme.userelatedproducts', 'useRelatedProducts [Deprecated]'], + ['/api-reference/magento-theme.usereview', 'useReview'], + ['/api-reference/magento-theme.useshipping', 'useShipping [Deprecated]'], + ['/api-reference/magento-theme.useshippingprovider', 'useShippingProvider'], + ['/api-reference/magento-theme.usestore', 'useStore'], + ['/api-reference/magento-theme.useuihelpers', 'useUiHelpers'], + ['/api-reference/magento-theme.useuinotification', 'useUiNotification'], + ['/api-reference/magento-theme.useuistate', 'useUiState'], + ['/api-reference/magento-theme.useupsellproducts', 'useUpsellProducts [Deprecated]'], + ['/api-reference/magento-theme.useurlresolver', 'useUrlResolver'], + ['/api-reference/magento-theme.useuser', 'useUser [Deprecated]'], + ['/api-reference/magento-theme.useuseraddress', 'useUserAddress'], + ['/api-reference/magento-theme.useuserorder', 'useUserOrder [Deprecated]'], + ['/api-reference/magento-theme.usewishlist', 'useWishlist [Deprecated]'], ], }, { From b787c5ff7d46c13ff397721f2e57d12607ae2c05 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 16 May 2022 13:21:35 +0200 Subject: [PATCH 379/486] fix: update type of the property --- packages/theme/composables/useConfig/useConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/theme/composables/useConfig/useConfig.ts b/packages/theme/composables/useConfig/useConfig.ts index 76f1700e5..211aaba9f 100644 --- a/packages/theme/composables/useConfig/useConfig.ts +++ b/packages/theme/composables/useConfig/useConfig.ts @@ -1,4 +1,4 @@ -import { ComputedRef, DeepReadonly, Ref } from '@nuxtjs/composition-api'; +import { ComputedRef, Readonly, Ref } from '@nuxtjs/composition-api'; import { StoreConfig } from '~/modules/GraphQL/types'; /** @@ -23,7 +23,7 @@ export interface UseConfigInterface { /** * Indicates whether any of the methods is in progress */ - loading: DeepReadonly>, + loading: Readonly>, /** * Loads store configuration From 7171038cbed918107a30c9ebad9c2f83b3887743 Mon Sep 17 00:00:00 2001 From: Filip Sobol Date: Mon, 16 May 2022 13:28:19 +0200 Subject: [PATCH 380/486] Revert "fix: update type of the property" This reverts commit 6158da3b7ad3fc11b7615b22ded9284f0619cf49. --- packages/theme/composables/useConfig/useConfig.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/theme/composables/useConfig/useConfig.ts b/packages/theme/composables/useConfig/useConfig.ts index 211aaba9f..76f1700e5 100644 --- a/packages/theme/composables/useConfig/useConfig.ts +++ b/packages/theme/composables/useConfig/useConfig.ts @@ -1,4 +1,4 @@ -import { ComputedRef, Readonly, Ref } from '@nuxtjs/composition-api'; +import { ComputedRef, DeepReadonly, Ref } from '@nuxtjs/composition-api'; import { StoreConfig } from '~/modules/GraphQL/types'; /** @@ -23,7 +23,7 @@ export interface UseConfigInterface { /** * Indicates whether any of the methods is in progress */ - loading: Readonly>, + loading: DeepReadonly>, /** * Loads store configuration From 5e9a8f0211e10f1872de62112017985c317795e8 Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Mon, 16 May 2022 12:54:50 +0200 Subject: [PATCH 381/486] fix: wrong warning announcement on modal window to login M2-563 --- .../modules/customer/composables/useUser/index.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/theme/modules/customer/composables/useUser/index.ts b/packages/theme/modules/customer/composables/useUser/index.ts index ad518f8ea..5ed2bfb96 100644 --- a/packages/theme/modules/customer/composables/useUser/index.ts +++ b/packages/theme/modules/customer/composables/useUser/index.ts @@ -167,16 +167,16 @@ export function useUser(): UseUserInterface { }, customQuery || {}, ); - Logger.debug('[Result]:', { data }); if (errors) { - Logger.error(errors.map((e) => e.message).join(',')); - } + const joinedErrors = errors.map((e) => e.message).join(','); + Logger.error(joinedErrors); + error.value.login = { message: joinedErrors }; - if (!data.generateCustomerToken || !data.generateCustomerToken.token) { - Logger.error('Customer sign-in error'); // todo: handle errors in better way + return; } + customerStore.setIsLoggedIn(true); apiState.setCustomerToken(data.generateCustomerToken.token); From 1f8bf09a600d27d296221735f10c05253fe9c20d Mon Sep 17 00:00:00 2001 From: Artur Tagisow <5359825+sethidden@users.noreply.github.com> Date: Mon, 16 May 2022 13:50:39 +0200 Subject: [PATCH 382/486] chore: fix ~240 eslint errors/warnings (#1005) --- .eslintignore | 4 +- commitlint.config.js | 2 +- internals/eslint-import/rules/plugins.js | 2 +- internals/eslint-jest/rules/extends.js | 2 +- internals/eslint-jest/rules/plugins.js | 2 +- internals/eslint-typescript/rules/extends.js | 2 +- internals/eslint-typescript/rules/plugins.js | 2 +- internals/eslint-vue/rules/plugins.js | 2 +- internals/eslint/rules/globals.js | 2 +- internals/eslint/rules/plugins.js | 2 +- packages/api-client/src/api/cmsPage/index.ts | 2 +- packages/theme/app/router.scrollBehavior.js | 4 +- .../useContent/commands/loadBlocksCommand.ts | 1 + .../useImage/__tests__/useImage.spec.js | 12 ++--- .../commands/loadReviewMetadataCommand.ts | 1 - .../__tests__/asyncLocalStorage.spec.js | 43 ++++++++-------- .../helpers/checkout/__tests__/steps.spec.js | 13 +++-- packages/theme/helpers/htmlDecoder.ts | 2 +- .../helpers/integrationPlugin/context.ts | 9 ++-- .../pages/Checkout/__tests__/Shipping.spec.js | 49 ------------------- packages/theme/modules/magento/index.ts | 2 +- packages/theme/tests/e2e/support/commands.js | 1 + .../click-outside/click-outside-directive.js | 15 +++--- 23 files changed, 66 insertions(+), 110 deletions(-) delete mode 100644 packages/theme/modules/checkout/pages/Checkout/__tests__/Shipping.spec.js diff --git a/.eslintignore b/.eslintignore index 6a3935a8e..7cbbadfda 100755 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,4 @@ **/node_modules/**/* **/lib/* -packages/composables/nuxt/plugin.js -packages/api-client/types/GraphQL.ts +packages/api-client/src/types/GraphQL.ts +packages/theme/static/sw.js diff --git a/commitlint.config.js b/commitlint.config.js index 28fe5c5bf..422b19445 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1 @@ -module.exports = {extends: ['@commitlint/config-conventional']} +module.exports = { extends: ['@commitlint/config-conventional'] }; diff --git a/internals/eslint-import/rules/plugins.js b/internals/eslint-import/rules/plugins.js index c7aac4061..9b7b4df5d 100644 --- a/internals/eslint-import/rules/plugins.js +++ b/internals/eslint-import/rules/plugins.js @@ -1,5 +1,5 @@ module.exports = { plugins: [ - 'import' + 'import', ], }; diff --git a/internals/eslint-jest/rules/extends.js b/internals/eslint-jest/rules/extends.js index d4a022229..38dc63056 100644 --- a/internals/eslint-jest/rules/extends.js +++ b/internals/eslint-jest/rules/extends.js @@ -1,5 +1,5 @@ module.exports = { extends: [ - 'plugin:jest/recommended' + 'plugin:jest/recommended', ], }; diff --git a/internals/eslint-jest/rules/plugins.js b/internals/eslint-jest/rules/plugins.js index f0c3ecc84..63a35a033 100644 --- a/internals/eslint-jest/rules/plugins.js +++ b/internals/eslint-jest/rules/plugins.js @@ -1,5 +1,5 @@ module.exports = { plugins: [ - 'jest' + 'jest', ], }; diff --git a/internals/eslint-typescript/rules/extends.js b/internals/eslint-typescript/rules/extends.js index c413a3296..6d6f7a124 100644 --- a/internals/eslint-typescript/rules/extends.js +++ b/internals/eslint-typescript/rules/extends.js @@ -1,5 +1,5 @@ module.exports = { extends: [ - 'plugin:@typescript-eslint/recommended-requiring-type-checking' + 'plugin:@typescript-eslint/recommended-requiring-type-checking', ], }; diff --git a/internals/eslint-typescript/rules/plugins.js b/internals/eslint-typescript/rules/plugins.js index d3e2b6231..40d8a41c1 100644 --- a/internals/eslint-typescript/rules/plugins.js +++ b/internals/eslint-typescript/rules/plugins.js @@ -1,5 +1,5 @@ module.exports = { plugins: [ - '@typescript-eslint' + '@typescript-eslint', ], }; diff --git a/internals/eslint-vue/rules/plugins.js b/internals/eslint-vue/rules/plugins.js index 72325c7c5..b3dca7b71 100644 --- a/internals/eslint-vue/rules/plugins.js +++ b/internals/eslint-vue/rules/plugins.js @@ -1,5 +1,5 @@ module.exports = { plugins: [ - 'vue' + 'vue', ], }; diff --git a/internals/eslint/rules/globals.js b/internals/eslint/rules/globals.js index 85837d335..8e94a4609 100644 --- a/internals/eslint/rules/globals.js +++ b/internals/eslint/rules/globals.js @@ -5,6 +5,6 @@ module.exports = { __statics: true, process: true, Capacitor: true, - chrome: true + chrome: true, }, }; diff --git a/internals/eslint/rules/plugins.js b/internals/eslint/rules/plugins.js index 6ca75d9e8..6b39a9d0e 100644 --- a/internals/eslint/rules/plugins.js +++ b/internals/eslint/rules/plugins.js @@ -1,5 +1,5 @@ module.exports = { plugins: [ - 'unicorn' + 'unicorn', ], }; diff --git a/packages/api-client/src/api/cmsPage/index.ts b/packages/api-client/src/api/cmsPage/index.ts index 67dcb7ed8..893b01cd0 100644 --- a/packages/api-client/src/api/cmsPage/index.ts +++ b/packages/api-client/src/api/cmsPage/index.ts @@ -45,4 +45,4 @@ export default async function getCmsPage( Logger.error(error); throw error.networkError?.result || error; } -}; +} diff --git a/packages/theme/app/router.scrollBehavior.js b/packages/theme/app/router.scrollBehavior.js index 4e0816d4c..64be137d8 100644 --- a/packages/theme/app/router.scrollBehavior.js +++ b/packages/theme/app/router.scrollBehavior.js @@ -1,6 +1,6 @@ -export default function (_to, _from, savedPosition) { +export default function scrollBehavior(_to, _from, savedPosition) { return savedPosition || { x: 0, y: 0, }; -}; +} diff --git a/packages/theme/composables/useContent/commands/loadBlocksCommand.ts b/packages/theme/composables/useContent/commands/loadBlocksCommand.ts index b63202aad..1cf4d9633 100644 --- a/packages/theme/composables/useContent/commands/loadBlocksCommand.ts +++ b/packages/theme/composables/useContent/commands/loadBlocksCommand.ts @@ -1,5 +1,6 @@ import { Logger } from '~/helpers/logger'; import { VsfContext } from '~/composables/context'; + export const loadBlocksCommand = { execute: async (context: VsfContext, params) => { Logger.debug('[Magento]: Load CMS Blocks content', { params }); diff --git a/packages/theme/composables/useImage/__tests__/useImage.spec.js b/packages/theme/composables/useImage/__tests__/useImage.spec.js index ad29f2b6c..96a903862 100644 --- a/packages/theme/composables/useImage/__tests__/useImage.spec.js +++ b/packages/theme/composables/useImage/__tests__/useImage.spec.js @@ -1,11 +1,9 @@ import { useContext } from '@nuxtjs/composition-api'; -import useImage from '../index'; +import { useImage } from '../index'; -jest.mock('@nuxtjs/composition-api', () => { - return { - useContext: jest.fn(), - }; -}); +jest.mock('@nuxtjs/composition-api', () => ({ + useContext: jest.fn(), +})); describe('useImage composable', () => { const testURL = 'https://mymagento.dev/media/image.png'; @@ -33,7 +31,7 @@ describe('useImage composable', () => { $magento: { config: { imageProvider: 'cloudinary', - magentoBaseUrl: 'https://mymagento.dev/' + magentoBaseUrl: 'https://mymagento.dev/', }, }, }, diff --git a/packages/theme/composables/useReview/commands/loadReviewMetadataCommand.ts b/packages/theme/composables/useReview/commands/loadReviewMetadataCommand.ts index db846a746..e47f74a30 100644 --- a/packages/theme/composables/useReview/commands/loadReviewMetadataCommand.ts +++ b/packages/theme/composables/useReview/commands/loadReviewMetadataCommand.ts @@ -1,7 +1,6 @@ import { Logger } from '~/helpers/logger'; import { VsfContext } from '~/composables/context'; - export const loadReviewMetadataCommand = { execute: async (context: VsfContext) => { Logger.debug('[Magento] load review metadata'); diff --git a/packages/theme/helpers/__tests__/asyncLocalStorage.spec.js b/packages/theme/helpers/__tests__/asyncLocalStorage.spec.js index 56b9d40a7..8fcc97144 100644 --- a/packages/theme/helpers/__tests__/asyncLocalStorage.spec.js +++ b/packages/theme/helpers/__tests__/asyncLocalStorage.spec.js @@ -1,9 +1,13 @@ -import { setItem, getItem, mergeItem, removeItem, clear } from '~/helpers/asyncLocalStorage'; +import { + setItem, getItem, mergeItem, removeItem, clear, +} from '~/helpers/asyncLocalStorage'; + +/* eslint-disable no-underscore-dangle */ describe('asyncLocalStorage :: Promised Based Localstorage Management', () => { test('setItem :: should store to localStorage by key', async () => { - const KEY = 'jest' - const VSF_KEY = `vsf-${KEY}` + const KEY = 'jest'; + const VSF_KEY = `vsf-${KEY}`; const VALUE = 'jest-localstorage-value'; const VSF_VALUE = JSON.stringify(VALUE); @@ -11,12 +15,12 @@ describe('asyncLocalStorage :: Promised Based Localstorage Management', () => { expect(localStorage.setItem).toHaveBeenLastCalledWith(VSF_KEY, VSF_VALUE); expect(localStorage.__STORE__[VSF_KEY]).toBe(VSF_VALUE); - expect(Object.keys(localStorage.__STORE__).length).toBe(1); + expect(Object.keys(localStorage.__STORE__)).toHaveLength(1); }); test('getItem :: should get value from localStorage by key', async () => { - const KEY = 'jest' - const VSF_KEY = `vsf-${KEY}` + const KEY = 'jest'; + const VSF_KEY = `vsf-${KEY}`; const VSF_VALUE = 'jest-localstorage-value'; const VALUE = await getItem(KEY); @@ -27,44 +31,43 @@ describe('asyncLocalStorage :: Promised Based Localstorage Management', () => { }); test('merge :: should merge values to localStorage by key', async () => { - const KEY = 'jest' - const VSF_KEY = `vsf-${KEY}` - const VALUE = {row1: 'Lonely'}; + const KEY = 'jest'; + const VSF_KEY = `vsf-${KEY}`; + const VALUE = { row1: 'Lonely' }; const VSF_VALUE = JSON.stringify(VALUE); - const MERGE_VALUE = {row2: 'Not anymore'}; + const MERGE_VALUE = { row2: 'Not anymore' }; const VSF_MERGE_VALUE = JSON.stringify({ row1: 'Lonely', - row2: 'Not anymore' - }) + row2: 'Not anymore', + }); await setItem(KEY, VALUE); expect(localStorage.__STORE__[VSF_KEY]).toBe(VSF_VALUE); - expect(Object.keys(localStorage.__STORE__).length).toBe(1); + expect(Object.keys(localStorage.__STORE__)).toHaveLength(1); await mergeItem(KEY, MERGE_VALUE); expect(localStorage.__STORE__[VSF_KEY]).toBe(VSF_MERGE_VALUE); - expect(Object.keys(localStorage.__STORE__).length).toBe(1); + expect(Object.keys(localStorage.__STORE__)).toHaveLength(1); }); test('remove :: should remove a key and value from localStorage', async () => { - const KEY = 'jest' - const VSF_KEY = `vsf-${KEY}` + const KEY = 'jest'; + const VSF_KEY = `vsf-${KEY}`; - expect(Object.keys(localStorage.__STORE__).length).toBe(1); + expect(Object.keys(localStorage.__STORE__)).toHaveLength(1); await removeItem(KEY); expect(localStorage.removeItem).toHaveBeenCalledWith(VSF_KEY); - expect(Object.keys(localStorage.__STORE__).length).toBe(0); + expect(Object.keys(localStorage.__STORE__)).toHaveLength(0); }); test('clear :: should clear all values and keys from localStorage', async () => { await clear(); expect(localStorage.clear).toHaveBeenCalledWith(); - expect(Object.keys(localStorage.__STORE__).length).toBe(0); + expect(Object.keys(localStorage.__STORE__)).toHaveLength(0); }); }); - diff --git a/packages/theme/helpers/checkout/__tests__/steps.spec.js b/packages/theme/helpers/checkout/__tests__/steps.spec.js index 4c43ee8aa..8171ae8da 100644 --- a/packages/theme/helpers/checkout/__tests__/steps.spec.js +++ b/packages/theme/helpers/checkout/__tests__/steps.spec.js @@ -1,25 +1,24 @@ -import { isPreviousStepValid } from '~/helpers/checkout/steps' +import { isPreviousStepValid } from '~/helpers/checkout/steps'; const CHECKOUT_DATA = { - 'my-account': {a: 'b', c: 'd'} -} + 'my-account': { a: 'b', c: 'd' }, +}; describe('steps :: steps helper for the checkout', () => { - beforeEach(async () => { localStorage.clear(); - localStorage.setItem('vsf-checkout', JSON.stringify(CHECKOUT_DATA)) + localStorage.setItem('vsf-checkout', JSON.stringify(CHECKOUT_DATA)); }); test('user can continue', async () => { - const isValid = await isPreviousStepValid('my-account') + const isValid = await isPreviousStepValid('my-account'); expect(isValid).toBeTruthy(); }); test('user can\'t continue', async () => { - const isValid = await isPreviousStepValid('billing') + const isValid = await isPreviousStepValid('billing'); expect(isValid).toBeFalsy(); }); diff --git a/packages/theme/helpers/htmlDecoder.ts b/packages/theme/helpers/htmlDecoder.ts index 577dec84b..600c80f9e 100644 --- a/packages/theme/helpers/htmlDecoder.ts +++ b/packages/theme/helpers/htmlDecoder.ts @@ -1,4 +1,4 @@ -export function htmlDecode(input) { +export function htmlDecode(input: string) { const formatName = () => { try { const domParser = new DOMParser(); diff --git a/packages/theme/helpers/integrationPlugin/context.ts b/packages/theme/helpers/integrationPlugin/context.ts index 1df5e6959..eaaa34a98 100644 --- a/packages/theme/helpers/integrationPlugin/context.ts +++ b/packages/theme/helpers/integrationPlugin/context.ts @@ -1,16 +1,17 @@ +/* eslint-disable no-param-reassign */ /** * It extends given integartion, defined by `tag` in the context. */ export const createExtendIntegrationInCtx = ({ tag, nuxtCtx, inject }) => (integrationProperties) => { - const integrationKey = '$' + tag; + const integrationKey = `$${tag}`; if (!nuxtCtx.$vsf || !nuxtCtx.$vsf[integrationKey]) { inject('vsf', { [integrationKey]: {} }); } Object.keys(integrationProperties) - .filter(k => !['api', 'client', 'config'].includes(k)) - .forEach(key => { + .filter((k) => !['api', 'client', 'config'].includes(k)) + .forEach((key) => { nuxtCtx.$vsf[integrationKey][key] = integrationProperties[key]; }); }; @@ -19,7 +20,7 @@ export const createExtendIntegrationInCtx = ({ tag, nuxtCtx, inject }) => (integ * It creates a function that adds an integration to the context under the given name, defined by `tag`. */ export const createAddIntegrationToCtx = ({ tag, nuxtCtx, inject }) => (integrationProperties) => { - const integrationKey = '$' + tag; + const integrationKey = `$${tag}`; if (nuxtCtx.$vsf && !nuxtCtx.$vsf[integrationKey]) { nuxtCtx.$vsf[integrationKey] = integrationProperties; diff --git a/packages/theme/modules/checkout/pages/Checkout/__tests__/Shipping.spec.js b/packages/theme/modules/checkout/pages/Checkout/__tests__/Shipping.spec.js deleted file mode 100644 index 7a0d5d7ee..000000000 --- a/packages/theme/modules/checkout/pages/Checkout/__tests__/Shipping.spec.js +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -import userEvent from '@testing-library/user-event'; -import { waitFor } from '@testing-library/vue'; -import { useRouter } from '@nuxtjs/composition-api'; -import { - useBilling, useUserBilling, useShipping, useCountrySearch, useGuestUser, -} from '~/composables'; -import { useUser } from '~/modules/customer/composables/useUser'; -import { - render, useBillingMock, useUserBillingMock, useShippingMock, useCountrySearchMock, useUserMock, useGuestUserMock, -} from '~/test-utils'; - -import Billing from '../Billing'; - -jest.mock('~/composables', () => ({ - useBilling: jest.fn(), - useCountrySearch: jest.fn(), - useGuestUser: jest.fn(), - useShipping: jest.fn(), - useUser: jest.fn(), - useUserBilling: jest.fn(), -})); - -jest.mock('@nuxtjs/composition-api', () => { - // Require the original module to not be mocked... - const originalModule = jest.requireActual('@nuxtjs/composition-api'); - - return { - ...originalModule, - useRouter: jest.fn(), - }; -}); - -describe('Checkout :: ', () => { - test.todo('Test onMount'); - // it('Form fields are rendered and validated', async () => { - // - // useBilling.mockReturnValue(useBillingMock()); - // useUserBilling.mockReturnValue(useUserBillingMock()); - // useShipping.mockReturnValue(useShippingMock()); - // useCountrySearch.mockReturnValue(useCountrySearchMock()); - // useUser.mockReturnValue(useUserMock()); - // useGuestUser.mockReturnValue(useGuestUserMock()); - // - // const { getByRole, findAllByText, html } = render(Billing); - // - // console.log(html) - // }); -}); diff --git a/packages/theme/modules/magento/index.ts b/packages/theme/modules/magento/index.ts index 015feefc2..8e1deaa0d 100644 --- a/packages/theme/modules/magento/index.ts +++ b/packages/theme/modules/magento/index.ts @@ -3,7 +3,7 @@ import { Module } from '@nuxt/types'; /* eslint-disable unicorn/prefer-module */ const path = require('path'); -const nuxtModule : Module = function (options) { +const nuxtModule : Module = function magentoModule(options) { this.extendBuild((config) => { // eslint-disable-next-line no-param-reassign config.resolve.alias['@vue-storefront/magento-api$'] = require.resolve('@vue-storefront/magento-api'); diff --git a/packages/theme/tests/e2e/support/commands.js b/packages/theme/tests/e2e/support/commands.js index 9ce9016cc..ee201e1be 100755 --- a/packages/theme/tests/e2e/support/commands.js +++ b/packages/theme/tests/e2e/support/commands.js @@ -1,4 +1,5 @@ /* eslint-disable no-undef */ +/* eslint-disable unicorn/no-empty-file */ // *********************************************** // This example commands.js shows you how to // create various custom commands and overwrite diff --git a/packages/theme/utilities/directives/click-outside/click-outside-directive.js b/packages/theme/utilities/directives/click-outside/click-outside-directive.js index e8b839446..93a12f9ac 100644 --- a/packages/theme/utilities/directives/click-outside/click-outside-directive.js +++ b/packages/theme/utilities/directives/click-outside/click-outside-directive.js @@ -1,19 +1,22 @@ +/* eslint-disable no-underscore-dangle */ +/* eslint-disable no-param-reassign */ + export const clickOutside = { bind(el, binding) { - binding.name = "click-outside"; + binding.name = 'click-outside'; const closeHandler = binding.value; - el._outsideClickHandler = function (event) { + el._outsideClickHandler = function clickOutsideHandler(event) { if (!el.contains(event.target)) { event.stopPropagation(); closeHandler(event, el); } }; - document.addEventListener("mousedown", el._outsideClickHandler); - document.addEventListener("touchstart", el._outsideClickHandler); + document.addEventListener('mousedown', el._outsideClickHandler); + document.addEventListener('touchstart', el._outsideClickHandler); }, unbind(el) { - document.removeEventListener("mousedown", el._outsideClickHandler); - document.removeEventListener("touchstart", el._outsideClickHandler); + document.removeEventListener('mousedown', el._outsideClickHandler); + document.removeEventListener('touchstart', el._outsideClickHandler); el._outsideClickHandler = null; }, }; From 53abd90b063423ec0bb74ad681e86f835a25528e Mon Sep 17 00:00:00 2001 From: Artur Tagisow <5359825+sethidden@users.noreply.github.com> Date: Mon, 16 May 2022 14:09:19 +0200 Subject: [PATCH 383/486] chore: use order.number instead of deprecated order.order_number (#1000) --- .../api-client/src/api/customerOrders/customerOrders.ts | 1 - .../customer/pages/MyAccount/OrderHistory/OrderHistory.vue | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/api-client/src/api/customerOrders/customerOrders.ts b/packages/api-client/src/api/customerOrders/customerOrders.ts index 2c2e95f2e..7b24b5908 100644 --- a/packages/api-client/src/api/customerOrders/customerOrders.ts +++ b/packages/api-client/src/api/customerOrders/customerOrders.ts @@ -5,7 +5,6 @@ export default gql` customer { orders(currentPage: $currentPage, filter: $filter, pageSize: $pageSize) { items { - order_number number id order_date diff --git a/packages/theme/modules/customer/pages/MyAccount/OrderHistory/OrderHistory.vue b/packages/theme/modules/customer/pages/MyAccount/OrderHistory/OrderHistory.vue index 401808cdf..52d6fcabf 100644 --- a/packages/theme/modules/customer/pages/MyAccount/OrderHistory/OrderHistory.vue +++ b/packages/theme/modules/customer/pages/MyAccount/OrderHistory/OrderHistory.vue @@ -41,9 +41,9 @@ - {{ order.order_number }} + {{ order.number }} {{ orderGetters.getDate(order) }} {{ $fc(orderGetters.getPrice(order)) }} @@ -52,7 +52,7 @@ {{ $t('View details') }} From 30cf12ece3e46e45d2ab3a6735ecb9dfaad0a740 Mon Sep 17 00:00:00 2001 From: Alexander Devitsky Date: Mon, 16 May 2022 16:35:59 +0300 Subject: [PATCH 384/486] fix: empty wishlist implementation --- packages/theme/lang/de.js | 1 + packages/theme/lang/en.js | 1 + .../customer/pages/MyAccount/MyWishlist.vue | 29 ++++---- .../wishlist/components/EmptyWishlist.vue | 72 +++++++++++++++++++ .../wishlist/components/WishlistSidebar.vue | 56 ++------------- .../__tests__/EmptyWishlist.spec.ts | 23 ++++++ 6 files changed, 117 insertions(+), 65 deletions(-) create mode 100644 packages/theme/modules/wishlist/components/EmptyWishlist.vue create mode 100644 packages/theme/modules/wishlist/components/__tests__/EmptyWishlist.spec.ts diff --git a/packages/theme/lang/de.js b/packages/theme/lang/de.js index 532ef85e6..8c293ca1c 100644 --- a/packages/theme/lang/de.js +++ b/packages/theme/lang/de.js @@ -87,6 +87,7 @@ export default { "Login": "Anmeldung", "login in to your account": "Anmelden bei Ihrem Konto", "Looks like you haven’t added any items to the bag yet. Start shopping to fill it in.": "Sieht so aus, als hätten Sie der Tasche noch keine Artikel hinzugefügt. Beginnen Sie mit dem Einkaufen, um es auszufüllen.", + "Looks like you haven’t added any items to the Wishlist.": "Sieht so aus, als hätten Sie keine Artikel zur Wunschliste hinzugefügt.", "Make an order": "Bestellung aufgeben", "Manage addresses": "Verwalten Sie alle gewünschten Adressen (Arbeitsplatz, Privatadresse...) Auf diese Weise müssen Sie die Adresse nicht bei jeder Bestellung manuell eingeben.", "Manage billing addresses": "Alle gewünschten Rechnungsadressen verwalten (Arbeitsplatz, Privatadresse ...) Auf diese Weise müssen Sie die Rechnungsadresse nicht bei jeder Bestellung manuell eingeben.", diff --git a/packages/theme/lang/en.js b/packages/theme/lang/en.js index a6cdf3335..ec90b88c3 100644 --- a/packages/theme/lang/en.js +++ b/packages/theme/lang/en.js @@ -85,6 +85,7 @@ export default { "Login": "Login", "login in to your account": "login in to your account", "Looks like you haven’t added any items to the bag yet. Start shopping to fill it in.": "Looks like you haven’t added any items to the bag yet. Start shopping to fill it in.", + "Looks like you haven’t added any items to the Wishlist.": "Looks like you haven’t added any items to the Wishlist.", "Make an order": "Make an order", "Manage addresses": "Manage all the addresses you want (work place, home address...) This way you won\"t have to enter the address manually with each order.", "Manage billing addresses": "Manage all the billing addresses you want (work place, home address...) This way you won\"t have to enter the billing address manually with each order.", diff --git a/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue b/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue index 7ba0879a7..109324499 100644 --- a/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue +++ b/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue @@ -7,22 +7,22 @@
-
+
-
-
- - -
-
+ - + diff --git a/packages/theme/modules/catalog/product/components/BundleProductSelector.vue b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProductSelector.vue similarity index 100% rename from packages/theme/modules/catalog/product/components/BundleProductSelector.vue rename to packages/theme/modules/catalog/product/components/product-types/bundle/BundleProductSelector.vue diff --git a/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue b/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue new file mode 100644 index 000000000..7349a80bf --- /dev/null +++ b/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue @@ -0,0 +1,346 @@ + + + diff --git a/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue new file mode 100644 index 000000000..4f1ecc060 --- /dev/null +++ b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue @@ -0,0 +1,218 @@ + + + diff --git a/packages/theme/modules/catalog/product/components/GroupedProductSelector.vue b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProductSelector.vue similarity index 100% rename from packages/theme/modules/catalog/product/components/GroupedProductSelector.vue rename to packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProductSelector.vue diff --git a/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue b/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue new file mode 100644 index 000000000..bf0bd48a7 --- /dev/null +++ b/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue @@ -0,0 +1,214 @@ + + + diff --git a/packages/theme/modules/catalog/product/components/product-types/styles.scss b/packages/theme/modules/catalog/product/components/product-types/styles.scss new file mode 100644 index 000000000..f93cf85fe --- /dev/null +++ b/packages/theme/modules/catalog/product/components/product-types/styles.scss @@ -0,0 +1,189 @@ +.product { + @include for-desktop { + display: flex; + } + + &__info { + margin: var(--spacer-sm) auto; + @include for-desktop { + margin: 0; + max-width: 32.625rem; + padding-left: var(--spacer-lg); + width: 100%; + } + } + + &__header { + --heading-title-color: var(--c-link); + --heading-title-font-weight: var(--font-weight--bold); + --heading-padding: 0; + margin: 0 var(--spacer-sm); + display: flex; + justify-content: space-between; + @include for-desktop { + --heading-title-font-weight: var(--font-weight--semibold); + margin: 0 auto; + } + } + + &__drag-icon { + animation: moveicon 1s ease-in-out infinite; + color: var(--c-text-disabled); + } + + &__price-and-rating { + margin: 0 var(--spacer-sm) var(--spacer-base); + align-items: center; + @include for-desktop { + display: flex; + justify-content: space-between; + margin: var(--spacer-sm) 0 var(--spacer-lg) 0; + } + } + + &__rating { + display: flex; + align-items: center; + justify-content: flex-end; + margin: var(--spacer-xs) 0 var(--spacer-xs); + } + + &__count { + @include font( + --count-font, + var(--font-weight--normal), + var(--font-size--sm), + 1.4, + var(--font-family--secondary) + ); + color: var(--c-text); + text-decoration: none; + margin: 0 0 0 var(--spacer-xs); + } + + &__description { + @include font( + --product-description-font, + var(--font-weight--light), + var(--font-size--base), + 1.6, + var(--font-family--primary) + ); + } + + &__add-to-cart { + margin: var(--spacer-base) var(--spacer-sm) 0; + @include for-desktop { + margin-top: var(--spacer-2xl); + } + } + + &__guide, + &__compare, + &__save { + display: block; + margin: var(--spacer-xl) 0 var(--spacer-base) auto; + } + + &__compare { + margin-top: 0; + } + + &__tabs { + --tabs-title-z-index: 0; + margin: var(--spacer-lg) auto var(--spacer-2xl); + --tabs-title-font-size: var(--font-size--lg); + @include for-desktop { + margin-top: var(--spacer-2xl); + } + } + + &__property { + margin: var(--spacer-base) 0; + + &__button { + --button-font-size: var(--font-size--base); + } + } + + &__review { + padding-bottom: 24px; + border-bottom: var(--c-light) solid 1px; + margin-bottom: var(--spacer-base); + } + + &__additional-info { + color: var(--c-link); + @include font( + --additional-info-font, + var(--font-weight--light), + var(--font-size--sm), + 1.6, + var(--font-family--primary) + ); + + &__title { + font-weight: var(--font-weight--normal); + font-size: var(--font-size--base); + margin: 0 0 var(--spacer-sm); + + &:not(:first-child) { + margin-top: 3.5rem; + } + } + + &__paragraph { + margin: 0; + } + } + + &__additional-actions { + display: flex; + justify-content: flex-start; + margin: 0 var(--spacer-sm); + @include for-desktop { + margin: 0; + } + } + + &__gallery { + flex: 1; + } +} + +.sf-gallery { + ::v-deep .glide__slide { + flex: none; + } +} + +@keyframes moveicon { + 0% { + transform: translate3d(0, 0, 0) rotate(90deg) scale(1, -1); + } + 50% { + transform: translate3d(10%, 0, 0) rotate(90deg) scale(1, -1); + } + 100% { + transform: translate3d(0, 0, 0) rotate(90deg) scale(1, -1); + } +} + +.loading { + &--product { + padding: var(--spacer-3xl) auto; + @include for-desktop { + padding-top: 3.75rem; + padding-bottom: 3.75rem; + } + } + + &--product-gallery { + padding: var(--spacer-3xl) auto; + height: 700px; + @include for-desktop { + padding-top: 3.75rem; + padding-bottom: 3.75rem; + } + } +} diff --git a/packages/theme/modules/catalog/product/components/tabs/ProductTabs.vue b/packages/theme/modules/catalog/product/components/tabs/ProductTabs.vue new file mode 100644 index 000000000..47b143c87 --- /dev/null +++ b/packages/theme/modules/catalog/product/components/tabs/ProductTabs.vue @@ -0,0 +1,181 @@ + + diff --git a/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts b/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts new file mode 100644 index 000000000..17d12be67 --- /dev/null +++ b/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts @@ -0,0 +1,28 @@ +import { computed } from '@nuxtjs/composition-api'; +import { getGallery as getProductGallery } from '~/modules/catalog/product/getters/productGetters'; +import { useImage } from '~/composables'; +import type { Product } from '~/modules/catalog/product/types'; +import type { UseProductGalleryInterface } from '~/modules/catalog/product/composables/useProductGallery/useProductGallery'; + +/** + * The `useProductGallery()` composable allows building product's gallery data structure. + * + * See the {@link UseProductGalleryInterface} page for more information. + */ +export function useProductGallery(product: Product): UseProductGalleryInterface { + const { getMagentoImage, imageSizes } = useImage(); + const productGallery = computed(() => getProductGallery(product).map((img) => ({ + mobile: { url: getMagentoImage(img.small) }, + desktop: { url: getMagentoImage(img.normal) }, + big: { url: getMagentoImage(img.big) }, + alt: product.name, + }))); + + return { + productGallery, + imageSizes, + }; +} + +export default useProductGallery; +export * from './useProductGallery'; diff --git a/packages/theme/modules/catalog/product/composables/useProductGallery/useProductGallery.ts b/packages/theme/modules/catalog/product/composables/useProductGallery/useProductGallery.ts new file mode 100644 index 000000000..9dceed6f9 --- /dev/null +++ b/packages/theme/modules/catalog/product/composables/useProductGallery/useProductGallery.ts @@ -0,0 +1,33 @@ +import { ComputedRef } from '@nuxtjs/composition-api'; +import { ImageSizes } from '~/composables'; + +/** + * Product gallery image data structure + */ +export interface ProductGalleryImageInterface { + url: string; +} + +/** + * Product gallery data structure + */ +export interface ProductGalleryInterface { + mobile?: ProductGalleryImageInterface; + desktop?: ProductGalleryImageInterface; + big?: ProductGalleryImageInterface; + alt?: string; +} + +/** + * Represents the data returned from and functions available in the `useProductGallery()` composable. + */ +export interface UseProductGalleryInterface { + /** + * Computed {@link ProductGalleryInterface} data array, mapped based on the product's gallery fetch + */ + productGallery: ComputedRef, + /** + * Available image sizes derived from {@link UseImageInterface} + */ + imageSizes: ImageSizes +} diff --git a/packages/theme/modules/catalog/product/composables/useProductTabs/index.ts b/packages/theme/modules/catalog/product/composables/useProductTabs/index.ts new file mode 100644 index 000000000..e2fb521be --- /dev/null +++ b/packages/theme/modules/catalog/product/composables/useProductTabs/index.ts @@ -0,0 +1,58 @@ +import { ref } from '@nuxtjs/composition-api'; +import type { TabsConfigInterface } from '~/modules/catalog/product/composables/useProductTabs/useProductTabs'; +import type { UseProductTabsInterface } from '~/modules/catalog/product/composables/useProductTabs'; + +export const TabsConfig: TabsConfigInterface = { + description: { + ID: 1, + title: 'Description', + }, + reviews: { + ID: 2, + title: 'Reviews', + }, + additional_info: { + ID: 3, + title: 'Additional info', + }, +}; + +/** + * The `useProductTabs()` composable allows manage product's tabs + * + * See the {@link UseProductTabsInterface} page for more information. + */ +export function useProductTabs(): UseProductTabsInterface { + const activeTab = ref(TabsConfig.description.ID); + + const setActiveTab = (tabId: number) => { + activeTab.value = tabId; + }; + + const openNewReviewTab = () => { + if (!process.client) return; + + setActiveTab(TabsConfig.reviews.ID); + const reviews = document.querySelector('#addReview'); + if (!reviews) return; + + setTimeout( + () => { + reviews.scrollIntoView({ + behavior: 'smooth', + block: 'end', + }); + }, + 500, + ); + }; + + return { + activeTab, + setActiveTab, + openNewReviewTab, + }; +} + +export default useProductTabs; +export * from './useProductTabs'; diff --git a/packages/theme/modules/catalog/product/composables/useProductTabs/useProductTabs.ts b/packages/theme/modules/catalog/product/composables/useProductTabs/useProductTabs.ts new file mode 100644 index 000000000..c9868084f --- /dev/null +++ b/packages/theme/modules/catalog/product/composables/useProductTabs/useProductTabs.ts @@ -0,0 +1,25 @@ +import { Ref } from '@nuxtjs/composition-api'; + +/** + * Single tab data structure + */ +export interface TabInterface { + ID: number; + title: string; +} + +/** + * Tabs configuration data structure + */ +export interface TabsConfigInterface { + [code: string]: TabInterface; +} + +/** + * Represents the data returned from and functions available in the `useProductTabs()` composable. + */ +export interface UseProductTabsInterface { + activeTab: Ref; + setActiveTab(tabId: number): void; + openNewReviewTab(): void; +} diff --git a/packages/theme/modules/catalog/product/enums/ProductTypeEnum.ts b/packages/theme/modules/catalog/product/enums/ProductTypeEnum.ts new file mode 100644 index 000000000..d39564e39 --- /dev/null +++ b/packages/theme/modules/catalog/product/enums/ProductTypeEnum.ts @@ -0,0 +1,7 @@ +export enum ProductTypeEnum { + SIMPLE_PRODUCT = 'SimpleProduct', + CONFIGURABLE_PRODUCT = 'ConfigurableProduct', + BUNDLE_PRODUCT = 'BundleProduct', + GROUPED_PRODUCT = 'GroupedProduct', + +} diff --git a/packages/theme/modules/catalog/product/enums/ProductTypeUnion.ts b/packages/theme/modules/catalog/product/enums/ProductTypeUnion.ts deleted file mode 100644 index a4ef36d4c..000000000 --- a/packages/theme/modules/catalog/product/enums/ProductTypeUnion.ts +++ /dev/null @@ -1 +0,0 @@ -export type ProductTypeUnion = 'SimpleProduct' | 'ConfigurableProduct' | 'BundleProduct' | 'GroupedProduct'; diff --git a/packages/theme/modules/checkout/composables/useCart/index.ts b/packages/theme/modules/checkout/composables/useCart/index.ts index af3e4cab8..894c3972c 100644 --- a/packages/theme/modules/checkout/composables/useCart/index.ts +++ b/packages/theme/modules/checkout/composables/useCart/index.ts @@ -13,6 +13,7 @@ import { Logger } from '~/helpers/logger'; import { Cart, CartItemInterface, ProductInterface } from '~/modules/GraphQL/types'; import { useCartStore } from '~/modules/checkout/stores/cart'; import { UseCartErrors, UseCartInterface } from './useCart'; +import { Product } from '~/modules/catalog/product/types'; /** * The `useCart` composable provides functions and refs to deal with a user's cart from Magento API. @@ -248,6 +249,20 @@ PRODUCT loading.value = false; } }; + + const canAddToCart = (product: Product, qty = 1) => { + // eslint-disable-next-line no-underscore-dangle + if (product?.__typename === 'ConfigurableProduct') { + return !!product?.configurable_product_options_selection?.variant + ?.uid; + } + const inStock = product?.stock_status || ''; + const stockLeft = product?.only_x_left_in_stock === null + ? true + : qty <= product?.only_x_left_in_stock; + return inStock && stockLeft; + }; + return { setCart, cart, @@ -260,6 +275,7 @@ PRODUCT updateItemQty, applyCoupon, removeCoupon, + canAddToCart, loading: readonly(loading), error: readonly(error), }; diff --git a/packages/theme/modules/checkout/composables/useCart/useCart.ts b/packages/theme/modules/checkout/composables/useCart/useCart.ts index 249f4ef20..348777f37 100644 --- a/packages/theme/modules/checkout/composables/useCart/useCart.ts +++ b/packages/theme/modules/checkout/composables/useCart/useCart.ts @@ -1,5 +1,6 @@ import { ComputedRef, Ref } from '@nuxtjs/composition-api'; import { ComposableFunctionArgs } from '~/composables/types'; +import { Product } from '~/modules/catalog/product/types'; /** * Parameters accepted by the `addItem` method in the {@link useCart} composable @@ -74,6 +75,8 @@ export interface UseCartInterface { setCart(newCart: CART): void; /** Returns the Items in the Cart as a `computed` property */ cart: ComputedRef; + /** Checks wheter a `product` can be added to the `cart` */ + canAddToCart(product: Product, qty: number); /** * The loading state. * From 883f253d68e70db064cd73563568cad2094d57dd Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Fri, 20 May 2022 12:22:02 +0200 Subject: [PATCH 412/486] fix: useProductGallery reactivity --- .../components/product-types/bundle/BundleProduct.vue | 5 +++-- .../product-types/configurable/ConfigurableProduct.vue | 5 +++-- .../components/product-types/grouped/GroupedProduct.vue | 5 +++-- .../components/product-types/simple/SimpleProduct.vue | 4 +++- .../product/composables/useProductGallery/index.ts | 8 ++++---- 5 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue index fa20ef50c..4d70129c0 100644 --- a/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue +++ b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue @@ -115,7 +115,7 @@ import { ref, computed, defineComponent, - PropType, + PropType, toRef, } from '@nuxtjs/composition-api'; import { @@ -170,8 +170,9 @@ export default defineComponent({ }, setup(props) { const qty = ref(1); + const product = toRef(props, 'product'); const { addItem, canAddToCart } = useCart(); - const { productGallery, imageSizes } = useProductGallery(props.product); + const { productGallery, imageSizes } = useProductGallery(product); const { activeTab, setActiveTab, openNewReviewTab } = useProductTabs(); const { isAuthenticated } = useUser(); const { addItem: addItemToWishlist, isInWishlist } = useWishlist(); diff --git a/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue b/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue index 7349a80bf..df0b906ed 100644 --- a/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue +++ b/packages/theme/modules/catalog/product/components/product-types/configurable/ConfigurableProduct.vue @@ -170,7 +170,7 @@ import { useRoute, useRouter, defineComponent, - PropType, + PropType, toRef, } from '@nuxtjs/composition-api'; import { @@ -227,10 +227,11 @@ export default defineComponent({ }, setup(props, { emit }) { const qty = ref(1); + const product = toRef(props, 'product'); const route = useRoute(); const router = useRouter(); const { addItem, loading: isCartLoading, canAddToCart } = useCart(); - const { productGallery, imageSizes } = useProductGallery(props.product); + const { productGallery, imageSizes } = useProductGallery(product); const { activeTab, setActiveTab, openNewReviewTab } = useProductTabs(); const { isAuthenticated } = useUser(); diff --git a/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue index 4f1ecc060..759761e3c 100644 --- a/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue +++ b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProduct.vue @@ -114,7 +114,7 @@ import { ref, computed, defineComponent, - PropType, + PropType, toRef, } from '@nuxtjs/composition-api'; import { @@ -169,8 +169,9 @@ export default defineComponent({ }, setup(props) { const qty = ref(1); + const product = toRef(props, 'product'); const { addItem, canAddToCart } = useCart(); - const { productGallery, imageSizes } = useProductGallery(props.product); + const { productGallery, imageSizes } = useProductGallery(product); const { activeTab, setActiveTab, openNewReviewTab } = useProductTabs(); const { isAuthenticated } = useUser(); diff --git a/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue b/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue index bf0bd48a7..9c884fa87 100644 --- a/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue +++ b/packages/theme/modules/catalog/product/components/product-types/simple/SimpleProduct.vue @@ -118,6 +118,7 @@ import { computed, defineComponent, PropType, + toRef, } from '@nuxtjs/composition-api'; import { @@ -170,8 +171,9 @@ export default defineComponent({ }, setup(props) { const qty = ref(1); + const product = toRef(props, 'product'); const { addItem, loading: isCartLoading, canAddToCart } = useCart(); - const { productGallery, imageSizes } = useProductGallery(props.product); + const { productGallery, imageSizes } = useProductGallery(product); const { isAuthenticated } = useUser(); const { addItem: addItemToWishlist, isInWishlist } = useWishlist(); const { activeTab, setActiveTab, openNewReviewTab } = useProductTabs(); diff --git a/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts b/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts index 17d12be67..0b4cf7d6d 100644 --- a/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts +++ b/packages/theme/modules/catalog/product/composables/useProductGallery/index.ts @@ -1,4 +1,4 @@ -import { computed } from '@nuxtjs/composition-api'; +import { computed, Ref } from '@nuxtjs/composition-api'; import { getGallery as getProductGallery } from '~/modules/catalog/product/getters/productGetters'; import { useImage } from '~/composables'; import type { Product } from '~/modules/catalog/product/types'; @@ -9,13 +9,13 @@ import type { UseProductGalleryInterface } from '~/modules/catalog/product/compo * * See the {@link UseProductGalleryInterface} page for more information. */ -export function useProductGallery(product: Product): UseProductGalleryInterface { +export function useProductGallery(product: Ref): UseProductGalleryInterface { const { getMagentoImage, imageSizes } = useImage(); - const productGallery = computed(() => getProductGallery(product).map((img) => ({ + const productGallery = computed(() => getProductGallery(product.value).map((img) => ({ mobile: { url: getMagentoImage(img.small) }, desktop: { url: getMagentoImage(img.normal) }, big: { url: getMagentoImage(img.big) }, - alt: product.name, + alt: product.value.name, }))); return { From f84f84e7784aea2a712cfa58ee68122e5a050ab3 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Fri, 20 May 2022 12:01:57 +0200 Subject: [PATCH 413/486] refactor: improve TopBar typing --- .../TopBar/{index.vue => TopBar.vue} | 17 ++++++++------- packages/theme/components/TopBar/useTopBar.ts | 21 ++++++++++++------- packages/theme/layouts/default.vue | 2 +- 3 files changed, 23 insertions(+), 17 deletions(-) rename packages/theme/components/TopBar/{index.vue => TopBar.vue} (71%) diff --git a/packages/theme/components/TopBar/index.vue b/packages/theme/components/TopBar/TopBar.vue similarity index 71% rename from packages/theme/components/TopBar/index.vue rename to packages/theme/components/TopBar/TopBar.vue index 7b742d9e6..ddbfea2aa 100644 --- a/packages/theme/components/TopBar/index.vue +++ b/packages/theme/components/TopBar/TopBar.vue @@ -18,26 +18,27 @@ - From 703b5d5834007b2c10866ca355f8b2063330a643 Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Mon, 23 May 2022 09:14:27 +0200 Subject: [PATCH 415/486] fix: add html content purify for the selected filters M2-574 --- .../filters/FiltersSidebar/SelectedFilters.vue | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/theme/modules/catalog/category/components/filters/FiltersSidebar/SelectedFilters.vue b/packages/theme/modules/catalog/category/components/filters/FiltersSidebar/SelectedFilters.vue index 1eee84c0b..b267ff9ea 100644 --- a/packages/theme/modules/catalog/category/components/filters/FiltersSidebar/SelectedFilters.vue +++ b/packages/theme/modules/catalog/category/components/filters/FiltersSidebar/SelectedFilters.vue @@ -5,9 +5,11 @@ :key="key" class="selected-filter" > - - {{ filter.label }} - +
', + expected: 'Lorem>Ipsum', + }, + { + received: '
Lorem&Ipsum
', + expected: 'Lorem&Ipsum', + }, + { + received: '
"Lorem Ipsum"
', + expected: '"Lorem Ipsum"', + }, + { + received: '
'Lorem Ipsum'
', + expected: '\'Lorem Ipsum\'', + }, + { + received: '
¢50
', + expected: '¢50', + }, + { + received: '
£50
', + expected: '£50', + }, + { + received: '
¥50
', + expected: '¥50', + }, + { + received: '
€50
', + expected: '€50', + }, + { + received: '
©Lorem Ipsum
', + expected: '©Lorem Ipsum', + }, + { + received: '
Lorem Ipsum®
', + expected: 'Lorem Ipsum®', + }, + { + received: '
Lorem Ipsum
', + expected: 'Lorem Ipsum', + }, + { + received: '
Lorem<Ipsum
', + expected: 'LoremLorem>Ipsum
', + expected: 'Lorem>Ipsum', + }, + { + received: '
Lorem&Ipsum
', + expected: 'Lorem&Ipsum', + }, + { + received: '
"Lorem Ipsum"
', + expected: '"Lorem Ipsum"', + }, + { + received: '
'Lorem Ipsum'
', + expected: '\'Lorem Ipsum\'', + }, + { + received: '
¢50
', + expected: '¢50', + }, + { + received: '
£50
', + expected: '£50', + }, + { + received: '
¥50
', + expected: '¥50', + }, + { + received: '
€50
', + expected: '€50', + }, + { + received: '
©Lorem Ipsum
', + expected: '©Lorem Ipsum', + }, + { + received: '
Lorem Ipsum®
', + expected: 'Lorem Ipsum®', + }, + { + received: '
', + expected: 'à', + }, + { + received: '
', + expected: 'á', + }, + { + received: '
', + expected: 'â', + }, + { + received: '
', + expected: 'ã', + }, +]; diff --git a/packages/theme/test-utils/tests/cmsContent.ts b/packages/theme/test-utils/tests/cmsContent.ts new file mode 100644 index 000000000..3e5a0d834 --- /dev/null +++ b/packages/theme/test-utils/tests/cmsContent.ts @@ -0,0 +1,14 @@ +import { render } from '~/test-utils'; +import { Content, cmsContentMock } from '~/test-utils/mocks/cmsContentMock'; + +// eslint-disable-next-line jest/no-export +export const cmsContentTest = (component) => { + test.each(cmsContentMock as Content[])( + '$received should be displayed as $expected', + ({ received, expected }) => { + const { getByText } = render(component, { props: { content: received } }); + + expect(getByText(expected)).toBeDefined(); + }, + ); +}; From 2b6036f0e9f93c3e0cfc4f10ae62087bf238b751 Mon Sep 17 00:00:00 2001 From: Alexander Devitsky Date: Mon, 23 May 2022 13:41:34 +0300 Subject: [PATCH 424/486] fix: fixed order summary styles --- .../OrderHistory/SingleOrder/OrderSummaryRow.vue | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder/OrderSummaryRow.vue b/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder/OrderSummaryRow.vue index 870f7752f..cd4f30656 100644 --- a/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder/OrderSummaryRow.vue +++ b/packages/theme/modules/customer/pages/MyAccount/OrderHistory/SingleOrder/OrderSummaryRow.vue @@ -46,7 +46,11 @@ export default defineComponent({ } ::v-deep tr { - --table-row-padding: var(--spacer-xs) var(--spacer-sm); + --table-row-padding: var(--spacer-xs) 0; + + @include for-desktop { + --table-row-padding: var(--spacer-xs) var(--spacer-sm); + } } &--bold { @@ -60,5 +64,13 @@ export default defineComponent({ --table-column-flex: 2; } } + + td { + order: 0; + + &:not(:first-child) { + --table-column-text-align: right; + } + } } From 12bf594ec9518a9a5efc79de5b0414bbc2309174 Mon Sep 17 00:00:00 2001 From: Marcin Kwiatkowski Date: Wed, 25 May 2022 08:09:44 +0200 Subject: [PATCH 425/486] chore: updated graphql-request (#1058) --- packages/theme/package.json | 2 +- yarn.lock | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/theme/package.json b/packages/theme/package.json index 71d08ac98..b89f52504 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -45,7 +45,7 @@ "cookie-universal-nuxt": "^2.1.5", "deepdash": "^5.3.9", "express": "4.17.3", - "graphql-request": "^4.0.0", + "graphql-request": "4.1.0", "is-https": "^4.0.0", "isomorphic-dompurify": "^0.18.0", "lodash.debounce": "^4.0.8", diff --git a/yarn.lock b/yarn.lock index daad72c3b..0aa28d574 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10366,6 +10366,15 @@ graphql-executor@0.0.18: resolved "https://registry.yarnpkg.com/graphql-executor/-/graphql-executor-0.0.18.tgz#6aa4b39e1ca773e159c2a602621e90606df0109a" integrity sha512-upUSl7tfZCZ5dWG1XkOvpG70Yk3duZKcCoi/uJso4WxJVT6KIrcK4nZ4+2X/hzx46pL8wAukgYHY6iNmocRN+g== +graphql-request@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-4.1.0.tgz#98d0d8d4458fd81674d8566d0b5781bd2823c26e" + integrity sha512-CBFcO6LP7cg+aBMc+x9C1dZEQsKTBZKR2J+HzuB0cR/6aaU4K4/tRXTQu8CDMp5195ZU+DTNKZZOSK1WRbTeAg== + dependencies: + cross-fetch "^3.0.6" + extract-files "^9.0.0" + form-data "^3.0.0" + graphql-request@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-4.0.0.tgz#5e4361d33df1a95ccd7ad23a8ebb6bbca9d5622f" From 9348fa1f02f9d787ba478c1b4807355a49dd65a7 Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Tue, 24 May 2022 10:14:12 +0200 Subject: [PATCH 426/486] fix: issue with displaying product price od PDP and PLP M2-573 --- packages/theme/composables/types.ts | 1 + packages/theme/lang/de.js | 5 +- packages/theme/lang/en.js | 3 + .../components/views/CategoryProductGrid.vue | 13 +-- .../components/views/CategoryProductList.vue | 12 ++- .../components/views/CategoryProductPrice.vue | 95 +++++++++++++++++++ .../views/useProductsWithCommonCardProps.ts | 1 + .../theme/modules/catalog/pages/category.vue | 1 + .../theme/modules/catalog/pages/product.vue | 3 +- .../product-types/bundle/BundleProduct.vue | 42 +++++--- .../bundle/BundleProductSelector.vue | 1 - .../grouped/GroupedProductSelector.vue | 1 + .../catalog/product/getters/productGetters.ts | 3 + .../catalog/product/helpers/bundleProduct.ts | 4 +- 14 files changed, 159 insertions(+), 26 deletions(-) create mode 100644 packages/theme/modules/catalog/category/components/views/CategoryProductPrice.vue diff --git a/packages/theme/composables/types.ts b/packages/theme/composables/types.ts index cb9f9ce1b..6cc16a7b1 100644 --- a/packages/theme/composables/types.ts +++ b/packages/theme/composables/types.ts @@ -59,6 +59,7 @@ export declare type ComposableFunctionArgs = T & { export interface AgnosticPrice { regular: number | null; special?: number | null; + maximum?: number | null; } export interface AgnosticMediaGalleryItem { diff --git a/packages/theme/lang/de.js b/packages/theme/lang/de.js index fd916111d..7645ac19d 100644 --- a/packages/theme/lang/de.js +++ b/packages/theme/lang/de.js @@ -270,5 +270,8 @@ export default { "Yes": "Ja", "No": "Nein", "Apply filters": "Filter anwenden", - "The coupon code isn't valid. Verify the code and try again.": "Der Gutscheincode ist ungültig. Überprüfen Sie den Code und versuchen Sie es erneut." + "The coupon code isn't valid. Verify the code and try again.": "Der Gutscheincode ist ungültig. Überprüfen Sie den Code und versuchen Sie es erneut.", + "From": "Aus", + "To": "Zu", + "Your customization": "Ihre Anpassung", }; diff --git a/packages/theme/lang/en.js b/packages/theme/lang/en.js index 5ae2ed6c9..b9c5af3c9 100644 --- a/packages/theme/lang/en.js +++ b/packages/theme/lang/en.js @@ -269,4 +269,7 @@ export default { "No": "No", "Apply filters": "Apply filters", "The coupon code isn't valid. Verify the code and try again.": "The coupon code isn't valid. Verify the code and try again.", + "From": "From", + "To": "To", + "Your customization": "Your customization", }; diff --git a/packages/theme/modules/catalog/category/components/views/CategoryProductGrid.vue b/packages/theme/modules/catalog/category/components/views/CategoryProductGrid.vue index 4a8d183c3..9718e0c74 100644 --- a/packages/theme/modules/catalog/category/components/views/CategoryProductGrid.vue +++ b/packages/theme/modules/catalog/category/components/views/CategoryProductGrid.vue @@ -31,12 +31,7 @@ @click:add-to-cart="$emit('click:add-to-cart', { product, quantity: 1 })" > @@ -45,17 +40,18 @@ + diff --git a/packages/theme/modules/catalog/category/components/views/useProductsWithCommonCardProps.ts b/packages/theme/modules/catalog/category/components/views/useProductsWithCommonCardProps.ts index 77ca36def..7019fe2c9 100644 --- a/packages/theme/modules/catalog/category/components/views/useProductsWithCommonCardProps.ts +++ b/packages/theme/modules/catalog/category/components/views/useProductsWithCommonCardProps.ts @@ -40,6 +40,7 @@ export const useProductsWithCommonProductCardProps = (products: Ref) const priceProps = { regularPrice: context.app.$fc(price.regular), specialPrice: price.special && context.app.$fc(getPrice(product).special), + maximumPrice: price.maximum && context.app.$fc(getPrice(product).maximum), }; const reviewProps = { diff --git a/packages/theme/modules/catalog/pages/category.vue b/packages/theme/modules/catalog/pages/category.vue index 8b383b61f..a9fc61526 100644 --- a/packages/theme/modules/catalog/pages/category.vue +++ b/packages/theme/modules/catalog/pages/category.vue @@ -45,6 +45,7 @@ (null); const { addTags } = useCache(); + const { localePath } = useContext(); const route = useRoute(); const { getProductDetails, loading } = useProduct(); const { error: nuxtError } = useContext(); @@ -74,7 +75,7 @@ export default defineComponent({ return getBreadcrumbs( product.value, Array.isArray(productCategories) ? [...productCategories].pop() : null, - ); + ).map((breadcrumb) => ({ ...breadcrumb, link: localePath(breadcrumb.link) })); }); const getBaseSearchQuery = () => ({ diff --git a/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue index 4d70129c0..fc24a26a3 100644 --- a/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue +++ b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProduct.vue @@ -37,10 +37,21 @@ />
- +
+ {{ $t('From') }} + + {{ $t('To') }} + + {{ $t('Your customization') }} + +
props.product?.short_description?.html || '', ); @@ -186,8 +195,11 @@ export default defineComponent({ () => props.product?.description?.html || '', ); - const productPrice = computed(() => getProductPrice(props.product).regular); - const productSpecialPrice = 0; // TODO add logic for special price calculation; + const productPrice = ref(getProductPrice(props.product).regular); + const productSpecialPrice = ref(getProductPrice(props.product).special); + const productMaximumPrice = ref(getProductPrice(props.product).maximum); + const customizationPrice = ref(productSpecialPrice.value ?? productPrice.value); + const totalReviews = computed(() => getTotalReviews(props.product)); const averageRating = computed(() => getAverageRating(props.product)); @@ -195,7 +207,6 @@ export default defineComponent({ addItem, addItemToWishlist, averageRating, - basePrice, canAddToCart, isAuthenticated, isInWishlist: computed(() => isInWishlist({ product: props.product })), @@ -204,8 +215,10 @@ export default defineComponent({ getProductName, getProductSwatchData, productPrice, - productShortDescription, productSpecialPrice, + productMaximumPrice, + customizationPrice, + productShortDescription, qty, totalReviews, imageSizes, @@ -219,4 +232,11 @@ export default defineComponent({ diff --git a/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProductSelector.vue b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProductSelector.vue index c94488e92..73c2b6f8c 100644 --- a/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProductSelector.vue +++ b/packages/theme/modules/catalog/product/components/product-types/bundle/BundleProductSelector.vue @@ -134,7 +134,6 @@ export default defineComponent({ }; const price = computed(() => Object.keys(selectedOptions.value) - // eslint-disable-next-line @typescript-eslint/no-unsafe-argument .reduce( (s, k) => s + Number.parseFloat(selectedOptions?.value[k]?.price as string) diff --git a/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProductSelector.vue b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProductSelector.vue index 378f4333d..d75a082ec 100644 --- a/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProductSelector.vue +++ b/packages/theme/modules/catalog/product/components/product-types/grouped/GroupedProductSelector.vue @@ -30,6 +30,7 @@ diff --git a/packages/theme/modules/catalog/product/getters/productGetters.ts b/packages/theme/modules/catalog/product/getters/productGetters.ts index 5b4a4ada1..607694656 100644 --- a/packages/theme/modules/catalog/product/getters/productGetters.ts +++ b/packages/theme/modules/catalog/product/getters/productGetters.ts @@ -73,10 +73,12 @@ export const getSlug = (product: ProductInterface, category?: CategoryTree | Cat export const getPrice = (product: ProductInterface): AgnosticPrice => { let regular = 0; let special = null; + let maximum = null; if (product?.price_range) { regular = product.price_range.minimum_price.regular_price.value; const final = product.price_range.minimum_price.final_price.value; + maximum = product.price_range.maximum_price.final_price.value; if (final < regular) { special = final; @@ -86,6 +88,7 @@ export const getPrice = (product: ProductInterface): AgnosticPrice => { return { regular, special, + maximum, }; }; diff --git a/packages/theme/modules/catalog/product/helpers/bundleProduct.ts b/packages/theme/modules/catalog/product/helpers/bundleProduct.ts index d7a292aaa..a59d3ddc2 100644 --- a/packages/theme/modules/catalog/product/helpers/bundleProduct.ts +++ b/packages/theme/modules/catalog/product/helpers/bundleProduct.ts @@ -3,13 +3,13 @@ import type { BundleProduct } from '~/modules/GraphQL/types'; // eslint-disable-next-line unicorn/prefer-object-from-entries export const bundleProductInitialSelector = (bundles: BundleProduct['items']) => (Array.isArray(bundles) ? bundles.reduce((acc, curr) => { const defaultValue = curr.options.find((o) => o.is_default); + const price = productGetters.getPrice(defaultValue.product); if (defaultValue) { acc[curr.uid] = { uid: defaultValue.uid, quantity: defaultValue.quantity || 1, - // @ts-ignore - price: productGetters.getPrice(defaultValue.product).regular, + price: price.special < price.regular && price.special !== null ? price.special : price.regular, }; } From 9e5b0ccea161e68d2372623d0b3342031132eb5a Mon Sep 17 00:00:00 2001 From: Bartosz Herba Date: Wed, 25 May 2022 07:53:07 +0200 Subject: [PATCH 427/486] fix: issue with displaying product price od PDP and PLP - CR issue resolve --- .../category/components/views/CategoryProductPrice.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/theme/modules/catalog/category/components/views/CategoryProductPrice.vue b/packages/theme/modules/catalog/category/components/views/CategoryProductPrice.vue index 15504e64b..155dba3ae 100644 --- a/packages/theme/modules/catalog/category/components/views/CategoryProductPrice.vue +++ b/packages/theme/modules/catalog/category/components/views/CategoryProductPrice.vue @@ -63,8 +63,8 @@ export default defineComponent({ }, props: { product: { - type: Object as PropType, - default: () => null, + type: Object as PropType['productsWithCommonProductCardProps']['value'][number] | null>, + required: true, }, }, }); From fa27f142ef9d8461a0dcb10be79ea03cd295c748 Mon Sep 17 00:00:00 2001 From: Marcin Kwiatkowski Date: Thu, 26 May 2022 07:28:17 +0200 Subject: [PATCH 428/486] chore: align develop branch with the main branch after rc.7 release (#1054) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * Fix useFacet(...) customQuery implemention (#413) * chore: updated version number to rc.5.3, updated yarn.lock, fixed cloud action * fix(theme): update localisation for all :link bindings (#449) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> * chore: release/1.0.0-rc.5.4 (#530) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * fix(theme): remove redundant cart load actions (#438) Co-authored-by: Bartosz Herba * perf(theme): updated nuxt.config.js to improve rebuild performance during development (#443) Updated the nuxt.config.js by increasing the enforceSizeThreshold and removing configuration properties * fix(theme): update localisation for all :link bindings (#450) Co-authored-by: Bartosz Herba * fix: handle currency switch issue (#441) * fix(theme): solve currency change issue * docs(theme): add currency formatting plugin information * test(theme): add UT for plugin and formatCurrency helper * refactor(fcplugin): change the logic responsible for resolving locale value Co-authored-by: Bartosz Herba * chore: align main with develop (#455) * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * Fix useFacet(...) customQuery implemention (#413) * chore: updated version number to rc.5.3, updated yarn.lock, fixed cloud action * fix(theme): update localisation for all :link bindings (#449) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan * fix(minicart): fix resolving configurable variants data (#456) Co-authored-by: Bartosz Herba * feat: added translations for german store (#459) * fix(composable): fix clearing cart on customer logout (#458) Co-authored-by: Bartosz Herba * fix(theme): fix fcPlugin issuse when cookies were not set yet - added default currency fallback (#460) Co-authored-by: Bartosz Herba * fix(api-client): update all cart related queries/mutation to include configurable variants data (#461) Co-authored-by: Bartosz Herba * fix(theme): fix adding product to a wishlist from a listed category page (#464) Co-authored-by: Bartosz Herba * fix(theme): add debounced update quantity action so it will be possible to insert multidigital value (#465) Co-authored-by: Bartosz Herba * fix(theme): fix customer account update data and password change functionality (#469) - Previously error and success messages were not displayed and the change password action always lead to an error, now either update data and password change are handled properly Co-authored-by: Bartosz Herba * perf(general): add performance improvement changes (#471) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * Revert "perf(general): add performance improvement changes (#471)" (#472) This reverts commit 2f06a692a3244efd47df73e3ba6fcfc0da2d8fd0. * fix: loosing data when moving between steps on the checkout (#440) * fix(theme): prevent user to click on next steps in the checkout * feat(theme): added an asyncLocalStorage helper * fix(theme): added feature so the User Account is filled in * fix(theme): user can't go pages directly * feat(theme): a helpers for validating is the user has access to a specific step in the checkout * feat(theme): implemented the validation in the checkout steps * test: added tests for asyncLocalStorage and the steps helper * fix(composables): re-calculate cart when changing shipping-method (#473) * feat(theme): add missing german translations (#479) Co-authored-by: Bartosz Herba * feat: added nuxt-img and possibility to use external image providers (#467) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * fix(theme): fix mobile home button alignment (#475) * refactor: m2-69. ssr optimization for default layout (#477) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * fix: incorrect shipping method price displayed in order summary (#481) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * fix(theme): fix footer lazy hydration (#488) Co-authored-by: Bartosz Herba * fix(theme): fixed product layout tablet (#487) * fix(theme): added spacing on the left and right of the checkout page (#486) * fix(theme): fixed payment setup style discrepancies (#484) * fix: incorrect shipping method price displayed in order summary (#496) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * chore: updated yarn.lock * fix(theme): redirect to home when accessing checkout if cart is empty * fix(theme): fixed hydration issue moved logic from SSR to onMounted to fix hydration difference * fix(theme): fixed cms page loading (#495) * fix(theme): fixed review page is empty if there are no reviews (#485) * fix(theme): ssr optimization for default layout (#506) Co-authored-by: Bartosz Herba * fix(theme): orders history table - no order details button on mobile (#505) * fix(theme): product bundle visual issue (#504) * fix(theme): add wishlist loading when customer is logging in (#509) Co-authored-by: Bartosz Herba * fix(theme): fix setting proper store and locale if there is no cookie (#508) Co-authored-by: Bartosz Herba * feat(recaptcha): add recaptcha (#401) * feat: add example file * feat: init recaptcha * feat(recaptcha): reverte some configs * feat(recaptcha): add v3 support * feat(recaptcha): add possibility to deactivate module and docs * feat(recaptcha): link reCaptcha doc * feat(recaptcha): link reCaptcha doc * feat(recaptcha): use fetch instead of axios * feat(recaptcha): add recaptcha to review form * feat(recaptcha): add recaptcha to reset password form * feat(recaptcha): add recaptcha to checkout form * feat(recaptcha): add recaptcha to forgot password and register forms * feat(recaptcha): code review * feat(recaptcha): refactoring * feat(recaptcha): add tests Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach * chore: added sentry (#507) * chore: added Sentry * build: added SENTRY_DSN variable to envs * build(updated sentry config): updated sentry config * build(added config for sentry performance integrartion): added config for sentry * chore: updated sentry config * chore: restored deployment config * test(theme): fixed loginModal component tests * feat: added support for @vue-storefront/cache module (#482) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * chore(theme): added @vue-storefront-cache module * chore(theme): added config for @vue-storefront/cache to nuxt.config.js * feat(theme): added cache tags to home and category page * chore(theme): added redis-cache module, fixed cache tags for category page * feat(theme): added cache tags to product page, added body parser server middleware * build: added config for redis, modified deployment config for tests * build: removed unnecessary redis_password env variable * build: fixed redis env variables names * feat(theme): added cache tags for cms pages * chore(theme): removed console.logs, added comments to nuxt.config.js * build: removed redis-cache module from package.json and addet it to dockerfile * build: updated dockerfile * build(updzted docker file): updated dovkerfile * build: added REDIS__ENABLED env variable * docs: added docs for redis caching * build: reverted test changes in deploy action * fix(theme): removed typo from Category template n * build: fixed GH deploy action * fix: billing address overwrites shipping address when copy flag is set (#510) * fix(theme): don't redirect with empty cart on thank-you step during the checkout * fix(theme): fix on billing step when address for shipping and billing are the same When addresses are the same, hide the form on the billing-step so users can't fill in a new address * chore(theme): added missing translations * build: added npm registry to dockerfile (#511) * build(deployment): added reCahptcha env variables, and modified deploy action (#515) * build(theme): extracted styles to separate .css chunks (#516) Co-authored-by: Heitor Ramon Ribeiro * fix(theme, composable): expired user token issue (#519) - add proper handling of unathorized requests Co-authored-by: Bartosz Herba * fix(theme): update login modal to handle translations (#521) Co-authored-by: Bartosz Herba * chore(theme): removed redis, sentry and reCaptcha config from nuxt.config.js (#522) * fix: added missing translations (#525) * chore(theme): added translations for the home-page * chore(theme): added translations for my-account * fix: disable ATC button while new product configuration is being loaded (#523) Co-authored-by: Alexander Devitsky * chore: added possibility to extend nuxt.config during deployment (#524) * build: introduced nuxt.config.additional.js * build: updated dockerfile * build: updated dockerfile * build: fixed type * build: fixed path * build: updated base nuxt config path * chore: removed recaptcha module from package.json * build: removed test changes from deployment config, upated recaptcha docs * chore: updated dependencies nad optimized dockerfile * docs: updated api docs * chore: disabled recaptcha * build: changed dockerfile * build: updated recaptcha deployment config * fix: fixed recaptcha enabled config type issue * build: manually disabled recaptcha * fix(composable): update useFacets to work with a customQueries * fix(theme): fix missing address details tab for non-english locale stores (#542) Co-authored-by: Bartosz Herba * refactor(theme): performance improvements (#541) * refactor(theme): moved magento configuration to separate non blocking component * build(theme): removed chunks configuration * refactor(theme): removed magentoConfiguration component * fix(theme): update address action will now properly load address data in form (#551) Co-authored-by: Bartosz Herba * fix(theme): fix add to wishlist button on catgory listing view for a mobile devices (#554) Co-authored-by: Bartosz Herba * fix(theme): save or update of address details in the customer account will no longer yield 404 (#555) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Georgiy Slobodenyuk Co-authored-by: Diego Alba <72459310+Diegoalbag@users.noreply.github.com> Co-authored-by: Abdellatif EL MIZEB Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach Co-authored-by: Alexander Devitsky Co-authored-by: Alexander Devitsky * docs: fix duplicated menu item (#574) * docs: fix typo (#588) * build(dockerfile): binded MAGENTO_BASE_URL to the env variable (#598) * fix(build): changed image provider to ipx (#600) * docs: updated docs main information * build: enabled redis on demo * build(deployment): changed URL of Magento backend * docs: updated environments, roadmap and functional catalog * build: enabled cloudinary on demo * chore: add #techforukraine * Update README.md * Update README.md * chore: updated readme * Update README.md * chore: change to an existing discord channel * chore: release 1.0.0-rc.6 (#661) * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * fix(theme): update localisation for all :link bindings (#450) Co-authored-by: Bartosz Herba * fix(theme): fix fcPlugin issuse when cookies were not set yet - added default currency fallback (#460) Co-authored-by: Bartosz Herba * fix(theme): add debounced update quantity action so it will be possible to insert multidigital value (#465) Co-authored-by: Bartosz Herba * Revert "perf(general): add performance improvement changes (#471)" (#472) This reverts commit 2f06a692a3244efd47df73e3ba6fcfc0da2d8fd0. * fix: loosing data when moving between steps on the checkout (#440) * fix(theme): prevent user to click on next steps in the checkout * feat(theme): added an asyncLocalStorage helper * fix(theme): added feature so the User Account is filled in * fix(theme): user can't go pages directly * feat(theme): a helpers for validating is the user has access to a specific step in the checkout * feat(theme): implemented the validation in the checkout steps * test: added tests for asyncLocalStorage and the steps helper * feat: added nuxt-img and possibility to use external image providers (#467) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * refactor: m2-69. ssr optimization for default layout (#477) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * fix: incorrect shipping method price displayed in order summary (#496) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * chore: updated yarn.lock * fix(theme): redirect to home when accessing checkout if cart is empty * fix(theme): fixed hydration issue moved logic from SSR to onMounted to fix hydration difference * feat(recaptcha): add recaptcha (#401) * feat: add example file * feat: init recaptcha * feat(recaptcha): reverte some configs * feat(recaptcha): add v3 support * feat(recaptcha): add possibility to deactivate module and docs * feat(recaptcha): link reCaptcha doc * feat(recaptcha): link reCaptcha doc * feat(recaptcha): use fetch instead of axios * feat(recaptcha): add recaptcha to review form * feat(recaptcha): add recaptcha to reset password form * feat(recaptcha): add recaptcha to checkout form * feat(recaptcha): add recaptcha to forgot password and register forms * feat(recaptcha): code review * feat(recaptcha): refactoring * feat(recaptcha): add tests Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach * chore: added sentry (#507) * chore: added Sentry * build: added SENTRY_DSN variable to envs * build(updated sentry config): updated sentry config * build(added config for sentry performance integrartion): added config for sentry * chore: updated sentry config * chore: restored deployment config * test(theme): fixed loginModal component tests * feat: added support for @vue-storefront/cache module (#482) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * chore(theme): added @vue-storefront-cache module * chore(theme): added config for @vue-storefront/cache to nuxt.config.js * feat(theme): added cache tags to home and category page * chore(theme): added redis-cache module, fixed cache tags for category page * feat(theme): added cache tags to product page, added body parser server middleware * build: added config for redis, modified deployment config for tests * build: removed unnecessary redis_password env variable * build: fixed redis env variables names * feat(theme): added cache tags for cms pages * chore(theme): removed console.logs, added comments to nuxt.config.js * build: removed redis-cache module from package.json and addet it to dockerfile * build: updated dockerfile * build(updzted docker file): updated dovkerfile * build: added REDIS__ENABLED env variable * docs: added docs for redis caching * build: reverted test changes in deploy action * fix(theme): removed typo from Category template n * build: fixed GH deploy action * build(theme): extracted styles to separate .css chunks (#516) Co-authored-by: Heitor Ramon Ribeiro * fix(theme, composable): expired user token issue (#519) - add proper handling of unathorized requests Co-authored-by: Bartosz Herba * chore(theme): removed redis, sentry and reCaptcha config from nuxt.config.js (#522) * chore: added possibility to extend nuxt.config during deployment (#524) * build: introduced nuxt.config.additional.js * build: updated dockerfile * build: updated dockerfile * build: fixed type * build: fixed path * build: updated base nuxt config path * chore: removed recaptcha module from package.json * build: removed test changes from deployment config, upated recaptcha docs * fix(theme): add html unescaping in HTMLContent component (#532) - add lodash.unescape to handle escaped html from magento Co-authored-by: Bartosz Herba * fix(theme): use translation function in all occurance of error[0] in theme (#529) Co-authored-by: Bartosz Herba * build: removed recaptcha from deployment config (#534) * fix: configurable product should work when only one attribute is used (#540) Co-authored-by: Alexander Devitsky * chore(theme): added missing translations (#553) * fix: the ability to close quick search using the keyboard (#552) Co-authored-by: Alexander Devitsky * fix(theme): fix add to wishlist button on catgory listing view for a mobile devices (#554) Co-authored-by: Bartosz Herba * chore: updated dependencies & configuration management (#538) * docs: updated docs to match missing elements * chore: added missing Redis password env * refactor(theme): added missing configuration envs Added missing configuration envs for Redis and Sentry * chore(eslint): updated dependencies - updated `eslint-plugin-unicorn` to `40.1.0` * chore(eslint-jest): updated dependencies - updated `eslint-plugin-jest` to `26.0.0` * chore(eslint-typescript): updated dependencies - updated `@typescript-eslint/eslint-plugin` to `5.10.1` - updated `@typescript-eslint/parser` to `5.10.1` * chore(eslint-vue): updated dependencies - updated `eslint-plugin-vue` to `8.4.0` * chore(api-client): updated dependencies - updated `@apollo/client` to `3.5.8` - updated `graphql` to `16.3.0` - updated `cross-fetch` to `3.1.5` - updated `dotenv` to `14.3.2` - updated `msw` to `0.36.7` - updated `typescript` to `4.5.5` * chore(theme): updated dependencies - updated `@sentry/tracing` to `6.17.3` - updated `@storefront-ui/vue` to `0.12.0` - updated `isomorphic-dompurify` to `0.18.0` - updated `@babel/core` to `7.16.12` - updated `cypress` to `9.3.1` - updated `dotenv` to `14.3.2` - updated `lint-staged` to `12.3.2` - updated `mocha` to `9.2.0` - updated `npm-check-updates` to `12.2.1` - updated `typescript` to `4.5.5` * chore: updated dependencies - updated `@babel/core` to `7.16.12` - updated `@babel/plugin-proposal-private-methods` to `7.16.11` - updated `@commitlint/cli` to `16.1.0` - updated `@graphql-codegen/cli` to `2.4.0` - updated `@types/node` to `17.0.13` - updated `@typescript-eslint/parser` to `5.10.1` - updated `eslint` to `8.8.0` - updated `lint-staged` to `12.3.2` - updated `npm-check-updates` to `12.2.1` - updated `rollup` to `2.66.1` - updated `vue-eslint-parser` to `8.2.0` * chore(eslint-typescript): updated dependencies - `@typescript-eslint/eslint-plugin` to `5.10.2` - `@typescript-eslint/parser` to `5.10.2` * chore(api-client): updated dependencies - `dotenv` to `15.0.0` - `msw` to `0.36.8` * chore(theme): rollback storefront-ui update * chore: updated dependencies - `@graphql-codegen/typescript-operations` to `2.2.3` - `@types/node` to `17.0.14` - `@typescript-eslint/parser` to `5.10.2` - `lint-staged` to `12.3.3` * chore: moved sentry package to Dockerfile * chore(theme): added dynamic nuxt.config.js generation * chore: removed REDIS__PASSWORD * chore: removed REDIS__PASSWORD from workflow * fix: fixed InstagramFeed component (#557) Co-authored-by: Alexander Devitsky * fix: changed header spacing (#556) Co-authored-by: Alexander Devitsky * build: add enterprise deployment (#561) * add enterprise deployment * change stage and dev * chore: allign main to develop after 1.0.0-rc.5.4 release (#560) * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * Fix useFacet(...) customQuery implemention (#413) * chore: updated version number to rc.5.3, updated yarn.lock, fixed cloud action * fix(theme): update localisation for all :link bindings (#449) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> * chore: release/1.0.0-rc.5.4 (#530) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * fix(theme): remove redundant cart load actions (#438) Co-authored-by: Bartosz Herba * perf(theme): updated nuxt.config.js to improve rebuild performance during development (#443) Updated the nuxt.config.js by increasing the enforceSizeThreshold and removing configuration properties * fix(theme): update localisation for all :link bindings (#450) Co-authored-by: Bartosz Herba * fix: handle currency switch issue (#441) * fix(theme): solve currency change issue * docs(theme): add currency formatting plugin information * test(theme): add UT for plugin and formatCurrency helper * refactor(fcplugin): change the logic responsible for resolving locale value Co-authored-by: Bartosz Herba * chore: align main with develop (#455) * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * Fix useFacet(...) customQuery implemention (#413) * chore: updated version number to rc.5.3, updated yarn.lock, fixed cloud action * fix(theme): update localisation for all :link bindings (#449) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan * fix(minicart): fix resolving configurable variants data (#456) Co-authored-by: Bartosz Herba * feat: added translations for german store (#459) * fix(composable): fix clearing cart on customer logout (#458) Co-authored-by: Bartosz Herba * fix(theme): fix fcPlugin issuse when cookies were not set yet - added default currency fallback (#460) Co-authored-by: Bartosz Herba * fix(api-client): update all cart related queries/mutation to include configurable variants data (#461) Co-authored-by: Bartosz Herba * fix(theme): fix adding product to a wishlist from a listed category page (#464) Co-authored-by: Bartosz Herba * fix(theme): add debounced update quantity action so it will be possible to insert multidigital value (#465) Co-authored-by: Bartosz Herba * fix(theme): fix customer account update data and password change functionality (#469) - Previously error and success messages were not displayed and the change password action always lead to an error, now either update data and password change are handled properly Co-authored-by: Bartosz Herba * perf(general): add performance improvement changes (#471) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * Revert "perf(general): add performance improvement changes (#471)" (#472) This reverts commit 2f06a692a3244efd47df73e3ba6fcfc0da2d8fd0. * fix: loosing data when moving between steps on the checkout (#440) * fix(theme): prevent user to click on next steps in the checkout * feat(theme): added an asyncLocalStorage helper * fix(theme): added feature so the User Account is filled in * fix(theme): user can't go pages directly * feat(theme): a helpers for validating is the user has access to a specific step in the checkout * feat(theme): implemented the validation in the checkout steps * test: added tests for asyncLocalStorage and the steps helper * fix(composables): re-calculate cart when changing shipping-method (#473) * feat(theme): add missing german translations (#479) Co-authored-by: Bartosz Herba * feat: added nuxt-img and possibility to use external image providers (#467) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * fix(theme): fix mobile home button alignment (#475) * refactor: m2-69. ssr optimization for default layout (#477) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * fix: incorrect shipping method price displayed in order summary (#481) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * fix(theme): fix footer lazy hydration (#488) Co-authored-by: Bartosz Herba * fix(theme): fixed product layout tablet (#487) * fix(theme): added spacing on the left and right of the checkout page (#486) * fix(theme): fixed payment setup style discrepancies (#484) * fix: incorrect shipping method price displayed in order summary (#496) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * chore: updated yarn.lock * fix(theme): redirect to home when accessing checkout if cart is empty * fix(theme): fixed hydration issue moved logic from SSR to onMounted to fix hydration difference * fix(theme): fixed cms page loading (#495) * fix(theme): fixed review page is empty if there are no reviews (#485) * fix(theme): ssr optimization for default layout (#506) Co-authored-by: Bartosz Herba * fix(theme): orders history table - no order details button on mobile (#505) * fix(theme): product bundle visual issue (#504) * fix(theme): add wishlist loading when customer is logging in (#509) Co-authored-by: Bartosz Herba * fix(theme): fix setting proper store and locale if there is no cookie (#508) Co-authored-by: Bartosz Herba * feat(recaptcha): add recaptcha (#401) * feat: add example file * feat: init recaptcha * feat(recaptcha): reverte some configs * feat(recaptcha): add v3 support * feat(recaptcha): add possibility to deactivate module and docs * feat(recaptcha): link reCaptcha doc * feat(recaptcha): link reCaptcha doc * feat(recaptcha): use fetch instead of axios * feat(recaptcha): add recaptcha to review form * feat(recaptcha): add recaptcha to reset password form * feat(recaptcha): add recaptcha to checkout form * feat(recaptcha): add recaptcha to forgot password and register forms * feat(recaptcha): code review * feat(recaptcha): refactoring * feat(recaptcha): add tests Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach * chore: added sentry (#507) * chore: added Sentry * build: added SENTRY_DSN variable to envs * build(updated sentry config): updated sentry config * build(added config for sentry performance integrartion): added config for sentry * chore: updated sentry config * chore: restored deployment config * test(theme): fixed loginModal component tests * feat: added support for @vue-storefront/cache module (#482) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * chore(theme): added @vue-storefront-cache module * chore(theme): added config for @vue-storefront/cache to nuxt.config.js * feat(theme): added cache tags to home and category page * chore(theme): added redis-cache module, fixed cache tags for category page * feat(theme): added cache tags to product page, added body parser server middleware * build: added config for redis, modified deployment config for tests * build: removed unnecessary redis_password env variable * build: fixed redis env variables names * feat(theme): added cache tags for cms pages * chore(theme): removed console.logs, added comments to nuxt.config.js * build: removed redis-cache module from package.json and addet it to dockerfile * build: updated dockerfile * build(updzted docker file): updated dovkerfile * build: added REDIS__ENABLED env variable * docs: added docs for redis caching * build: reverted test changes in deploy action * fix(theme): removed typo from Category template n * build: fixed GH deploy action * fix: billing address overwrites shipping address when copy flag is set (#510) * fix(theme): don't redirect with empty cart on thank-you step during the checkout * fix(theme): fix on billing step when address for shipping and billing are the same When addresses are the same, hide the form on the billing-step so users can't fill in a new address * chore(theme): added missing translations * build: added npm registry to dockerfile (#511) * build(deployment): added reCahptcha env variables, and modified deploy action (#515) * build(theme): extracted styles to separate .css chunks (#516) Co-authored-by: Heitor Ramon Ribeiro * fix(theme, composable): expired user token issue (#519) - add proper handling of unathorized requests Co-authored-by: Bartosz Herba * fix(theme): update login modal to handle translations (#521) Co-authored-by: Bartosz Herba * chore(theme): removed redis, sentry and reCaptcha config from nuxt.config.js (#522) * fix: added missing translations (#525) * chore(theme): added translations for the home-page * chore(theme): added translations for my-account * fix: disable ATC button while new product configuration is being loaded (#523) Co-authored-by: Alexander Devitsky * chore: added possibility to extend nuxt.config during deployment (#524) * build: introduced nuxt.config.additional.js * build: updated dockerfile * build: updated dockerfile * build: fixed type * build: fixed path * build: updated base nuxt config path * chore: removed recaptcha module from package.json * build: removed test changes from deployment config, upated recaptcha docs * chore: updated dependencies nad optimized dockerfile * docs: updated api docs * chore: disabled recaptcha * build: changed dockerfile * build: updated recaptcha deployment config * fix: fixed recaptcha enabled config type issue * build: manually disabled recaptcha * fix(composable): update useFacets to work with a customQueries * fix(theme): fix missing address details tab for non-english locale stores (#542) Co-authored-by: Bartosz Herba * refactor(theme): performance improvements (#541) * refactor(theme): moved magento configuration to separate non blocking component * build(theme): removed chunks configuration * refactor(theme): removed magentoConfiguration component * fix(theme): update address action will now properly load address data in form (#551) Co-authored-by: Bartosz Herba * fix(theme): fix add to wishlist button on catgory listing view for a mobile devices (#554) Co-authored-by: Bartosz Herba * fix(theme): save or update of address details in the customer account will no longer yield 404 (#555) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Georgiy Slobodenyuk Co-authored-by: Diego Alba <72459310+Diegoalbag@users.noreply.github.com> Co-authored-by: Abdellatif EL MIZEB Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach Co-authored-by: Alexander Devitsky Co-authored-by: Alexander Devitsky Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Georgiy Slobodenyuk Co-authored-by: Diego Alba <72459310+Diegoalbag@users.noreply.github.com> Co-authored-by: Abdellatif EL MIZEB Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach Co-authored-by: Alexander Devitsky Co-authored-by: Alexander Devitsky * refactor: added loazy loaded components for default layout and app header (#564) * chore(theme): removed recaptcha from package.json * refactor(theme): added lazy loaded components to default layout and app header * refactor(theme): updated deployment & dependencies (#563) * build: updated deployment * refactor(theme): update theme dependencies for a production builds * Delete config.js Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba * refactor(theme): added lazy loading for offscreen images on homepage (#565) * fix(theme): fix missing shipping address form on the checkout for a comming back customer (#566) Co-authored-by: Bartosz Herba * refactor(theme): remove core _theme module (#567) - remove core @vue-storefront/magento-theme module to save build weigh, module was no more necessary but had an impact on the final build - rework dompurify as a plugin to save bundle size BREAKING CHANGE: - remove core @vue-storefront/magento-theme dependency Co-authored-by: Bartosz Herba * fix(theme): fix dompurify arguments injection (#573) Co-authored-by: Bartosz Herba * feat: mobile menu (#569) Co-authored-by: Alexander Devitsky * chore: fixed some error reported by eslint (#562) * chore: fixed some error reported by eslint * refactor: removed unnecessary type file * fix: small fixes for mobile (#580) * fix(theme): show currency-switcher on mobile * fix(theme): only show login-modal when user isn't logged in * refactor(general): refactor how and where the cart is loaded - add loadTotalQuantity method on the cart composable as sometimes this is the only information needed - add lazy load for a minicart - header will pull only total quantity data instead of loading whole cart * feat(theme): add conditional rendering for a store switcher and currency switcher - if there is less than 2 currencies/stores relevant switcher will be not displayed * build(tsconfig): changed target in tdconfig files from es5 to es2019 * build(github actions): updated draft release and merge release GH actions * refactor(theme): moved loadStores and loadCurrencies to separate components * refactor(theme): refactored store switcher * refactor(theme): refactored currency swithcer * feat(theme): added useApi composable, refactored topBar - added useApi composable to use GraphQL APi on the client side * chore(composables): made useCustomQuery composables deprecated * feat(theme): - add wishlist lazyload and totalItems shared field * perf(theme): lazy load loginModal * feat(theme): add LoadWhenVisible component and lazyload footer - update social icons to reduce weight and increase quality - load footer only when visible * refactor(theme): changed VSF logo and favicon * refactor(theme): fixed cms pages layout * build: added redis * build: fixed redis cache invalidation * build(build): fixed merge-release GH action * fix(theme): clear login modal reset password data when modal is closed * refactor(theme): add homepage missing german translations * perf(theme): appHeader navigation improvement - add @nuxtjs/device package to recognize used device - remove mobile observer from header and replave it with device recognition tool - navigation is now lazy loaded, categories required for a navigation are not loaded at all on mobile devices * fix(redis): added missing redis config * refactor(theme): refactor SearchBar component - move search bar component to components/Header - remove unused code and watchers * fix(config): fixed redis__enabled varaible binding * build(cache): enabled varnish * fix(api): fix cart_id graphql error * fix: centered empty cart text and image * feat(theme): add sorting select in the navbar on the mobile category view * fix(theme): [Category] Save for later button should be hidden for guest user * fix(theme): [My Account] Aligned State/Province input * chore(theme): Product removal confirmation out of viewport * fix(theme): added radio-button filter for mobile * fix(theme): refactored how the selected filters values are set * feat: asset Optimization * feat(theme): add pagination on the category mobile view * fix(theme): [Product] Fixed Additional information tab * refactor: optimized build, fixed small bugs * fix(myaccount): fix few bugs on my account - fix hydration issues - rework and fix reviews composable - add import of missing email validators - fix readonly computable error in the app header * refactor(theme): made TopBar component lazy loaded * chore: release 1.0.0 * refactor(theme): fixed cache issues * fix(theme): refactored when clicking outside the search-results * fix(theme): better aligned search input icon * fix(theme): refactored watcher * chore: updated readme * chore(theme): Customer cannot change their email on mobile * Update package.json * chore(docs): updated api reference Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Kevin Gorjan Co-authored-by: Abdellatif EL MIZEB Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach Co-authored-by: Alexander Devitsky Co-authored-by: Alexander Devitsky Co-authored-by: Andrzej Pawcenis Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Georgiy Slobodenyuk Co-authored-by: Diego Alba <72459310+Diegoalbag@users.noreply.github.com> Co-authored-by: Diego Alba Co-authored-by: GitHub actions Co-authored-by: Filip Sobol * chore: updated packages versions (#695) * chore: updated readme (#696) * Update README.md * doc: update override-queries * docs: removed duplicated section from docs * docs(guide): update override-queries.md * docs: remove Roadmap document (#852) * docs: updated contributors and fixed discord channel (#888) * fix: disabled external checkout on production env (#907) * docs: updated readme links (#917) * docs: add analytics * chore: release 1.0.0-rc.7 (#949) * fix(theme): fix dompurify arguments injection (#573) Co-authored-by: Bartosz Herba * feat: mobile menu (#569) Co-authored-by: Alexander Devitsky * chore: fixed some error reported by eslint (#562) * chore: fixed some error reported by eslint * refactor: removed unnecessary type file * fix: small fixes for mobile (#580) * fix(theme): show currency-switcher on mobile * fix(theme): only show login-modal when user isn't logged in * build(dockerfile): binded MAGENTO_BASE_URL to the env variable (#597) * fix(build): changed image provider to ipx (#599) * refactor(general): refactor how and where the cart is loaded - add loadTotalQuantity method on the cart composable as sometimes this is the only information needed - add lazy load for a minicart - header will pull only total quantity data instead of loading whole cart * feat(theme): add conditional rendering for a store switcher and currency switcher - if there is less than 2 currencies/stores relevant switcher will be not displayed * build(tsconfig): changed target in tdconfig files from es5 to es2019 * build(github actions): updated draft release and merge release GH actions * refactor(theme): moved loadStores and loadCurrencies to separate components * refactor(theme): refactored store switcher * refactor(theme): refactored currency swithcer * feat(theme): added useApi composable, refactored topBar - added useApi composable to use GraphQL APi on the client side * chore(composables): made useCustomQuery composables deprecated * feat(theme): - add wishlist lazyload and totalItems shared field * perf(theme): lazy load loginModal * feat(theme): add LoadWhenVisible component and lazyload footer - update social icons to reduce weight and increase quality - load footer only when visible * refactor(theme): changed VSF logo and favicon * refactor(theme): fixed cms pages layout * build: added redis * build: fixed redis cache invalidation * build(build): fixed merge-release GH action * fix(theme): clear login modal reset password data when modal is closed * refactor(theme): add homepage missing german translations * perf(theme): appHeader navigation improvement - add @nuxtjs/device package to recognize used device - remove mobile observer from header and replave it with device recognition tool - navigation is now lazy loaded, categories required for a navigation are not loaded at all on mobile devices * build(deployment): changed URL of Magento backend * fix(redis): added missing redis config * refactor(theme): refactor SearchBar component - move search bar component to components/Header - remove unused code and watchers * fix(config): fixed redis__enabled varaible binding * build(cache): enabled varnish * fix(api): fix cart_id graphql error * fix: centered empty cart text and image * feat(theme): add sorting select in the navbar on the mobile category view * fix(theme): [Category] Save for later button should be hidden for guest user * fix(theme): [My Account] Aligned State/Province input * chore(theme): Product removal confirmation out of viewport * fix(theme): added radio-button filter for mobile * fix(theme): refactored how the selected filters values are set * feat: asset Optimization * feat(theme): add pagination on the category mobile view * fix(theme): [Product] Fixed Additional information tab * refactor: optimized build, fixed small bugs * fix(myaccount): fix few bugs on my account - fix hydration issues - rework and fix reviews composable - add import of missing email validators - fix readonly computable error in the app header * refactor(theme): made TopBar component lazy loaded * refactor(theme): fixed cache issues * fix(theme): refactored when clicking outside the search-results * fix(theme): better aligned search input icon * fix(theme): refactored watcher * chore: updated readme * refactor(theme): category page refactoring step-1 - separate category page and sidebar logic - add resolving layput configuration on category page - move navbar to a separate component - add redis cache for the sidebar - add empty results page * chore(theme): Customer cannot change their email on mobile * Update package.json * fix(theme): center wishlist `` vertically this is not based on any Figma designs - just aligning `WishlistSidebar.vue` with `CartSidebar.vue` This is a fix ONLY for the desktop version. There's still a few px of vertical difference between the `` on mobile CartSidebar and mobile WishlistSidebar, but that's because one of them has a text header and the other doesn't (separate issue) * fix(theme): add products from list view with correct quantity Also made some minor eslint fixes since I "touched" the file and husky started detecting them * feat(theme): add basic skeleton loader component * build: refactored precommit hooks execution * fix(theme): better looking default shipping/billing address badges * fix(M2-146): Correct desktop order history column alignment * fix(theme): fix error when adding single quantity product * feat: migrate to ESM and esbuild * chore: revert few changes * chore: restore yarn.lock in docs * docs: update TypeScript and yarn.lock * chore: revert changes that require Node 16 * chore: revert changes * chore: improve dev command in api-client * fix(theme): fix cart's product url resolving for a configurable products * chore: allign main to develop after 1.0.0-rc.6 release (#697) * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * Fix useFacet(...) customQuery implemention (#413) * chore: updated version number to rc.5.3, updated yarn.lock, fixed cloud action * fix(theme): update localisation for all :link bindings (#449) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> * chore: release/1.0.0-rc.5.4 (#530) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * fix(theme): remove redundant cart load actions (#438) Co-authored-by: Bartosz Herba * perf(theme): updated nuxt.config.js to improve rebuild performance during development (#443) Updated the nuxt.config.js by increasing the enforceSizeThreshold and removing configuration properties * fix(theme): update localisation for all :link bindings (#450) Co-authored-by: Bartosz Herba * fix: handle currency switch issue (#441) * fix(theme): solve currency change issue * docs(theme): add currency formatting plugin information * test(theme): add UT for plugin and formatCurrency helper * refactor(fcplugin): change the logic responsible for resolving locale value Co-authored-by: Bartosz Herba * chore: align main with develop (#455) * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator (#414) * refactor: update dependencies (#420) * refactor(eslint): updated dependencies - Updated `eslint-plugin-unicorn` to `40.0.0` * refactor(eslint-import): updated dependencies - Updated `eslint-plugin-import` to `2.25.4` * refactor(eslint-jest): updated dependencies - Updated `eslint-plugin-jest` to `25.3.4` * refactor(eslint-typescript): updated dependencies - Updated `@typescript-eslint/eslint-plugin` to `5.9.1` - Updated `@typescript-eslint/parser` to `5.9.1` * refactor(eslint-vue): updated dependencies - Updated `eslint-plugin-vue` to `8.3.0` * refactor(api-client): updated dependencies - Updated `@apollo/client` to `3.5.7` - Updated `dotenv` to `12.0.1` * refactor(theme): updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `babel-jest` to `27.4.6` - Updated `cypress` to `9.2.1` - Updated `dotenv` to `12.0.1` - Updated `jest` to `27.4.7` - Updated `jest-environment-jsdom` to `27.4.6` - Updated `lint-staged` to `12.1.7` - Updated `mocha` to `9.1.4` - Updated `npm-check-updates` to `12.1.0` - Updated `ts-jest` to `27.1.3` * refactor: updated dependencies - Updated `@babel/core` to `7.16.7` - Updated `@babel/plugin-proposal-private-methods` to `7.16.7` - Updated `@commitlint/cli` to `16.0.2` - Updated `@commitlint/config-conventional` to `16.0.0` - Updated `@commitlint/config-lerna-scopes` to `16.0.0` - Updated `@graphql-codegen/cli` to `2.3.1` - Updated `@graphql-codegen/typescript` to `2.4.2` - Updated `@graphql-codegen/typescript-operations` to `2.2.2` - Updated `@graphql-tools/utils` to `8.6.1` - Updated `@rollup/plugin-node-resolve` to `13.1.3` - Updated `@types/jest` to `27.4.0` - Updated `@types/node` to `17.0.8` - Updated `@typescript-eslint/parser` to `5.9.1` - Updated `@vue/eslint-config-typescript` to `10.0.0` - Updated `eslin` to `8.6.0` - Updated `jest` to `27.4.7` - Updated `lint-staged` to `12.1.7` - Updated `npm-check-updates` to `12.1.0` - Updated `rollup` to `2.64.0` - Updated `shx` to `0.3.4` - Updated `ts-jest` to `27.1.3``` * refactor(theme): enables currency switcher on TopBar.vue (#421) * fix(theme): fix 404 issue when redirecting to address details page (#424) Co-authored-by: Bartosz Herba * test: scaffold unit tests in composables and api client package (#419) * test(composables): added jest config * tests(composables): rewritten test + fix in productGetter * tests(composables): updated configuration in jest.config.js * tests(api-client): added tests for api-client + move general config to jest.base.config.js * tests(api-client): added jest configuration + simple test * chore: removed jest-environment-jsdom-sixteen * tests(theme): reverted back and removed jest.base.config.json * test(composables): reverted back and removed jest.base.config.json * test(api-client): reverted back and removed jest.base.config.json * chore: removed jest.base.config.json Co-authored-by: Marcin Kwiatkowski * fix(theme): fix disappearing category sidebar filter change (#423) Co-authored-by: Bartosz Herba * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix(api-client): update default mutation error handling for apollo client (#429) Co-authored-by: Bartosz Herba * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * Fix useFacet(...) customQuery implemention (#413) * chore: updated version number to rc.5.3, updated yarn.lock, fixed cloud action * fix(theme): update localisation for all :link bindings (#449) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan * fix(minicart): fix resolving configurable variants data (#456) Co-authored-by: Bartosz Herba * feat: added translations for german store (#459) * fix(composable): fix clearing cart on customer logout (#458) Co-authored-by: Bartosz Herba * fix(theme): fix fcPlugin issuse when cookies were not set yet - added default currency fallback (#460) Co-authored-by: Bartosz Herba * fix(api-client): update all cart related queries/mutation to include configurable variants data (#461) Co-authored-by: Bartosz Herba * fix(theme): fix adding product to a wishlist from a listed category page (#464) Co-authored-by: Bartosz Herba * fix(theme): add debounced update quantity action so it will be possible to insert multidigital value (#465) Co-authored-by: Bartosz Herba * fix(theme): fix customer account update data and password change functionality (#469) - Previously error and success messages were not displayed and the change password action always lead to an error, now either update data and password change are handled properly Co-authored-by: Bartosz Herba * perf(general): add performance improvement changes (#471) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * Revert "perf(general): add performance improvement changes (#471)" (#472) This reverts commit 2f06a692a3244efd47df73e3ba6fcfc0da2d8fd0. * fix: loosing data when moving between steps on the checkout (#440) * fix(theme): prevent user to click on next steps in the checkout * feat(theme): added an asyncLocalStorage helper * fix(theme): added feature so the User Account is filled in * fix(theme): user can't go pages directly * feat(theme): a helpers for validating is the user has access to a specific step in the checkout * feat(theme): implemented the validation in the checkout steps * test: added tests for asyncLocalStorage and the steps helper * fix(composables): re-calculate cart when changing shipping-method (#473) * feat(theme): add missing german translations (#479) Co-authored-by: Bartosz Herba * feat: added nuxt-img and possibility to use external image providers (#467) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * fix(theme): fix mobile home button alignment (#475) * refactor: m2-69. ssr optimization for default layout (#477) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * fix: incorrect shipping method price displayed in order summary (#481) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * fix(theme): fix footer lazy hydration (#488) Co-authored-by: Bartosz Herba * fix(theme): fixed product layout tablet (#487) * fix(theme): added spacing on the left and right of the checkout page (#486) * fix(theme): fixed payment setup style discrepancies (#484) * fix: incorrect shipping method price displayed in order summary (#496) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * chore: updated yarn.lock * fix(theme): redirect to home when accessing checkout if cart is empty * fix(theme): fixed hydration issue moved logic from SSR to onMounted to fix hydration difference * fix(theme): fixed cms page loading (#495) * fix(theme): fixed review page is empty if there are no reviews (#485) * fix(theme): ssr optimization for default layout (#506) Co-authored-by: Bartosz Herba * fix(theme): orders history table - no order details button on mobile (#505) * fix(theme): product bundle visual issue (#504) * fix(theme): add wishlist loading when customer is logging in (#509) Co-authored-by: Bartosz Herba * fix(theme): fix setting proper store and locale if there is no cookie (#508) Co-authored-by: Bartosz Herba * feat(recaptcha): add recaptcha (#401) * feat: add example file * feat: init recaptcha * feat(recaptcha): reverte some configs * feat(recaptcha): add v3 support * feat(recaptcha): add possibility to deactivate module and docs * feat(recaptcha): link reCaptcha doc * feat(recaptcha): link reCaptcha doc * feat(recaptcha): use fetch instead of axios * feat(recaptcha): add recaptcha to review form * feat(recaptcha): add recaptcha to reset password form * feat(recaptcha): add recaptcha to checkout form * feat(recaptcha): add recaptcha to forgot password and register forms * feat(recaptcha): code review * feat(recaptcha): refactoring * feat(recaptcha): add tests Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach * chore: added sentry (#507) * chore: added Sentry * build: added SENTRY_DSN variable to envs * build(updated sentry config): updated sentry config * build(added config for sentry performance integrartion): added config for sentry * chore: updated sentry config * chore: restored deployment config * test(theme): fixed loginModal component tests * feat: added support for @vue-storefront/cache module (#482) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * chore(theme): added @vue-storefront-cache module * chore(theme): added config for @vue-storefront/cache to nuxt.config.js * feat(theme): added cache tags to home and category page * chore(theme): added redis-cache module, fixed cache tags for category page * feat(theme): added cache tags to product page, added body parser server middleware * build: added config for redis, modified deployment config for tests * build: removed unnecessary redis_password env variable * build: fixed redis env variables names * feat(theme): added cache tags for cms pages * chore(theme): removed console.logs, added comments to nuxt.config.js * build: removed redis-cache module from package.json and addet it to dockerfile * build: updated dockerfile * build(updzted docker file): updated dovkerfile * build: added REDIS__ENABLED env variable * docs: added docs for redis caching * build: reverted test changes in deploy action * fix(theme): removed typo from Category template n * build: fixed GH deploy action * fix: billing address overwrites shipping address when copy flag is set (#510) * fix(theme): don't redirect with empty cart on thank-you step during the checkout * fix(theme): fix on billing step when address for shipping and billing are the same When addresses are the same, hide the form on the billing-step so users can't fill in a new address * chore(theme): added missing translations * build: added npm registry to dockerfile (#511) * build(deployment): added reCahptcha env variables, and modified deploy action (#515) * build(theme): extracted styles to separate .css chunks (#516) Co-authored-by: Heitor Ramon Ribeiro * fix(theme, composable): expired user token issue (#519) - add proper handling of unathorized requests Co-authored-by: Bartosz Herba * fix(theme): update login modal to handle translations (#521) Co-authored-by: Bartosz Herba * chore(theme): removed redis, sentry and reCaptcha config from nuxt.config.js (#522) * fix: added missing translations (#525) * chore(theme): added translations for the home-page * chore(theme): added translations for my-account * fix: disable ATC button while new product configuration is being loaded (#523) Co-authored-by: Alexander Devitsky * chore: added possibility to extend nuxt.config during deployment (#524) * build: introduced nuxt.config.additional.js * build: updated dockerfile * build: updated dockerfile * build: fixed type * build: fixed path * build: updated base nuxt config path * chore: removed recaptcha module from package.json * build: removed test changes from deployment config, upated recaptcha docs * chore: updated dependencies nad optimized dockerfile * docs: updated api docs * chore: disabled recaptcha * build: changed dockerfile * build: updated recaptcha deployment config * fix: fixed recaptcha enabled config type issue * build: manually disabled recaptcha * fix(composable): update useFacets to work with a customQueries * fix(theme): fix missing address details tab for non-english locale stores (#542) Co-authored-by: Bartosz Herba * refactor(theme): performance improvements (#541) * refactor(theme): moved magento configuration to separate non blocking component * build(theme): removed chunks configuration * refactor(theme): removed magentoConfiguration component * fix(theme): update address action will now properly load address data in form (#551) Co-authored-by: Bartosz Herba * fix(theme): fix add to wishlist button on catgory listing view for a mobile devices (#554) Co-authored-by: Bartosz Herba * fix(theme): save or update of address details in the customer account will no longer yield 404 (#555) Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Georgiy Slobodenyuk Co-authored-by: Diego Alba <72459310+Diegoalbag@users.noreply.github.com> Co-authored-by: Abdellatif EL MIZEB Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach Co-authored-by: Alexander Devitsky Co-authored-by: Alexander Devitsky * docs: fix duplicated menu item (#574) * docs: fix typo (#588) * build(dockerfile): binded MAGENTO_BASE_URL to the env variable (#598) * fix(build): changed image provider to ipx (#600) * docs: updated docs main information * build: enabled redis on demo * build(deployment): changed URL of Magento backend * docs: updated environments, roadmap and functional catalog * build: enabled cloudinary on demo * chore: add #techforukraine * Update README.md * Update README.md * chore: updated readme * Update README.md * chore: change to an existing discord channel * chore: release 1.0.0-rc.6 (#661) * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): out of stock product will no longer break cart (#404) * fix(theme): out of stock product will no longer break cart * fix(theme): remove cart load from layout * docs(theme): update tests for CartSidebar Co-authored-by: Bartosz Herba * Revert "refactor(theme): enables currency switcher on TopBar.vue (#421)" (#426) This reverts commit fbb1598ae7d78ebe3319e0d9d3c1a8dacc2de402. * refactor(i18n): changed i18n middleware to plugin and fix store switc… (#425) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(theme): changed i18n midl. to plugin & fix store switcher by url (#431) * refactor(i18n): changed i18n middleware to plugin and fix store switcher by url issues * refactor: cR fixes for i18n * refactor(composables): added `ConfigState` to export API * chore: updated yarn.lock * refactor(theme): updated i18n middleware to fix URL redirect * docs: updated API-Extractor Co-authored-by: Marcin Kwiatkowski * fix: expired user token (#392) * fix(theme): disabled checkbox on login-modal * feat(theme): log customer out when customer-token is expired * feat: added token expired notification, clear cart and customer token when customer is not logged in * feat: logged out notification * refactor: removed console log * refactor: added improvements for token-expired plugin, added unit tests * refactor: changed log out notification message * test: fixed token-expired plugin test * test: added cookies mock to test-utils Co-authored-by: Marcin Kwiatkowski * refactor(theme): enable the currency switcher on `TopBar.vue` (#430) * refactor(theme): enables currency switcher on TopBar.vue * refactor(theme): add safe checking on Currency Selector * fix(theme): update localisation for all :link bindings (#450) Co-authored-by: Bartosz Herba * fix(theme): fix fcPlugin issuse when cookies were not set yet - added default currency fallback (#460) Co-authored-by: Bartosz Herba * fix(theme): add debounced update quantity action so it will be possible to insert multidigital value (#465) Co-authored-by: Bartosz Herba * Revert "perf(general): add performance improvement changes (#471)" (#472) This reverts commit 2f06a692a3244efd47df73e3ba6fcfc0da2d8fd0. * fix: loosing data when moving between steps on the checkout (#440) * fix(theme): prevent user to click on next steps in the checkout * feat(theme): added an asyncLocalStorage helper * fix(theme): added feature so the User Account is filled in * fix(theme): user can't go pages directly * feat(theme): a helpers for validating is the user has access to a specific step in the checkout * feat(theme): implemented the validation in the checkout steps * test: added tests for asyncLocalStorage and the steps helper * feat: added nuxt-img and possibility to use external image providers (#467) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * refactor: m2-69. ssr optimization for default layout (#477) * Test performance improvement commit * chore(deployment): changed deployment config to allow A-B testing on stage * refactor: changed default layout hydration Co-authored-by: Bartosz Herba Co-authored-by: Marcin Kwiatkowski * fix: incorrect shipping method price displayed in order summary (#496) * fix(composables): re-calculate cart when changing shipping-method * fix(theme): removed cache-id for retrieving shipping methods Cache id is removed because it retrieves the cached shipping methods. But when the address changes, it can be that the price of shipping methods need to be updated * chore: updated yarn.lock * fix(theme): redirect to home when accessing checkout if cart is empty * fix(theme): fixed hydration issue moved logic from SSR to onMounted to fix hydration difference * feat(recaptcha): add recaptcha (#401) * feat: add example file * feat: init recaptcha * feat(recaptcha): reverte some configs * feat(recaptcha): add v3 support * feat(recaptcha): add possibility to deactivate module and docs * feat(recaptcha): link reCaptcha doc * feat(recaptcha): link reCaptcha doc * feat(recaptcha): use fetch instead of axios * feat(recaptcha): add recaptcha to review form * feat(recaptcha): add recaptcha to reset password form * feat(recaptcha): add recaptcha to checkout form * feat(recaptcha): add recaptcha to forgot password and register forms * feat(recaptcha): code review * feat(recaptcha): refactoring * feat(recaptcha): add tests Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach * chore: added sentry (#507) * chore: added Sentry * build: added SENTRY_DSN variable to envs * build(updated sentry config): updated sentry config * build(added config for sentry performance integrartion): added config for sentry * chore: updated sentry config * chore: restored deployment config * test(theme): fixed loginModal component tests * feat: added support for @vue-storefront/cache module (#482) * chore(theme): added nuxt-image * feat(theme): added nuxt-img to category page * feat: added nuxt-img to category pages, added newe configs, and useImage compoosable * feat(theme): added nuxt-img to products carousel, added image enums * feat(theme): added nuxt-img for search results * feat(theme): added nuxt-img to my account wishlist * feat(theme): changed log to use nuxt-img * feat(theme): changed empty cart icon to use nuxt-img * feat(theme): added nuxt-img to instagram feed, updated image names * feat(theme): changed error image on search results to use nuxt-img * feat(theme): update store switcher to use nuxt-img instead of SfImage * feat(theme): added nuxt-img to wishlist sidebar * feat(theme): added nuxt-img to MobileStoreBanner * feat(theme): added nuxt-img to grouoped product selector * feat(theme): added nuxt-img to payment component * docs: added docs for external images providers * build(cloud): updated vuestorefront cloud docker file and added new args * build: updated deploy gh action to add image env vatiables * docs(configuration): updated docs for image providers * build: added missed buildargs * build: fixed dockerfile * build: fixed typo in docker file * build: updated config * test: add unit tests for the useImage composable * chore(theme): added @vue-storefront-cache module * chore(theme): added config for @vue-storefront/cache to nuxt.config.js * feat(theme): added cache tags to home and category page * chore(theme): added redis-cache module, fixed cache tags for category page * feat(theme): added cache tags to product page, added body parser server middleware * build: added config for redis, modified deployment config for tests * build: removed unnecessary redis_password env variable * build: fixed redis env variables names * feat(theme): added cache tags for cms pages * chore(theme): removed console.logs, added comments to nuxt.config.js * build: removed redis-cache module from package.json and addet it to dockerfile * build: updated dockerfile * build(updzted docker file): updated dovkerfile * build: added REDIS__ENABLED env variable * docs: added docs for redis caching * build: reverted test changes in deploy action * fix(theme): removed typo from Category template n * build: fixed GH deploy action * build(theme): extracted styles to separate .css chunks (#516) Co-authored-by: Heitor Ramon Ribeiro * fix(theme, composable): expired user token issue (#519) - add proper handling of unathorized requests Co-authored-by: Bartosz Herba * chore(theme): removed redis, sentry and reCaptcha config from nuxt.config.js (#522) * chore: added possibility to extend nuxt.config during deployment (#524) * build: introduced nuxt.config.additional.js * build: updated dockerfile * build: updated dockerfile * build: fixed type * build: fixed path * build: updated base nuxt config path * chore: removed recaptcha module from package.json * build: removed test changes from deployment config, upated recaptcha docs * fix(theme): add html unescaping in HTMLContent component (#532) - add lodash.unescape to handle escaped html from magento Co-authored-by: Bartosz Herba * fix(theme): use translation function in all occurance of error[0] in theme (#529) Co-authored-by: Bartosz Herba * build: removed recaptcha from deployment config (#534) * fix: configurable product should work when only one attribute is used (#540) Co-authored-by: Alexander Devitsky * chore(theme): added missing translations (#553) * fix: the ability to close quick search using the keyboard (#552) Co-authored-by: Alexander Devitsky * fix(theme): fix add to wishlist button on catgory listing view for a mobile devices (#554) Co-authored-by: Bartosz Herba * chore: updated dependencies & configuration management (#538) * docs: updated docs to match missing elements * chore: added missing Redis password env * refactor(theme): added missing configuration envs Added missing configuration envs for Redis and Sentry * chore(eslint): updated dependencies - updated `eslint-plugin-unicorn` to `40.1.0` * chore(eslint-jest): updated dependencies - updated `eslint-plugin-jest` to `26.0.0` * chore(eslint-typescript): updated dependencies - updated `@typescript-eslint/eslint-plugin` to `5.10.1` - updated `@typescript-eslint/parser` to `5.10.1` * chore(eslint-vue): updated dependencies - updated `eslint-plugin-vue` to `8.4.0` * chore(api-client): updated dependencies - updated `@apollo/client` to `3.5.8` - updated `graphql` to `16.3.0` - updated `cross-fetch` to `3.1.5` - updated `dotenv` to `14.3.2` - updated `msw` to `0.36.7` - updated `typescript` to `4.5.5` * chore(theme): updated dependencies - updated `@sentry/tracing` to `6.17.3` - updated `@storefront-ui/vue` to `0.12.0` - updated `isomorphic-dompurify` to `0.18.0` - updated `@babel/core` to `7.16.12` - updated `cypress` to `9.3.1` - updated `dotenv` to `14.3.2` - updated `lint-staged` to `12.3.2` - updated `mocha` to `9.2.0` - updated `npm-check-updates` to `12.2.1` - updated `typescript` to `4.5.5` * chore: updated dependencies - updated `@babel/core` to `7.16.12` - updated `@babel/plugin-proposal-private-methods` to `7.16.11` - updated `@commitlint/cli` to `16.1.0` - updated `@graphql-codegen/cli` to `2.4.0` - updated `@types/node` to `17.0.13` - updated `@typescript-eslint/parser` to `5.10.1` - updated `eslint` to `8.8.0` - updated `lint-staged` to `12.3.2` - updated `npm-check-updates` to `12.2.1` - updated `rollup` to `2.66.1` - updated `vue-eslint-parser` to `8.2.0` * chore(eslint-typescript): updated dependencies - `@typescript-eslint/eslint-plugin` to `5.10.2` - `@typescript-eslint/parser` to `5.10.2` * chore(api-client): updated dependencies - `dotenv` to `15.0.0` - `msw` to `0.36.8` * chore(theme): rollback storefront-ui update * chore: updated dependencies - `@graphql-codegen/typescript-operations` to `2.2.3` - `@types/node` to `17.0.14` - `@typescript-eslint/parser` to `5.10.2` - `lint-staged` to `12.3.3` * chore: moved sentry package to Dockerfile * chore(theme): added dynamic nuxt.config.js generation * chore: removed REDIS__PASSWORD * chore: removed REDIS__PASSWORD from workflow * fix: fixed InstagramFeed component (#557) Co-authored-by: Alexander Devitsky * fix: changed header spacing (#556) Co-authored-by: Alexander Devitsky * build: add enterprise deployment (#561) * add enterprise deployment * change stage and dev * chore: allign main to develop after 1.0.0-rc.5.4 release (#560) * Fix useFacet(...) customQuery implemention (#413) * chore: release 1.0.0-rc.5.3 (#437) * chore: add gitflow actions (#379) * chore: added base gitflow actions * chore: added base gitflow actions * chore: fixed versioning process * docs: added roadmap to the docs (#380) closes #323 * fix(theme): refactor and fix store switcher (#383) - update nuxt.config.js to handle de translation - fix issue with flag icon #362 - refactor store switcher component - add store name next to the language icon flag - add translation info in docs Co-authored-by: Bartosz Herba * fix(theme): fix preselection sort order when query param is available (#385) Co-authored-by: Bartosz Herba * fix: broken cart after placing order as guest (#386) * fix(theme): passing the email instead of the user-object for creating a guest-cart * fix(composables): remove empty params in array, fails on Magento * test(theme): updated test for attaching guest email address to cart * Update packages/composables/src/composables/useShipping/index.ts Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski Co-authored-by: Heitor Ramon Ribeiro * fix(theme): fix flashing category page (#387) Co-authored-by: Bartosz Herba * fix(theme): fix flashing category page (#388) Co-authored-by: Bartosz Herba * fix: default billing information does not appear on address (#382) * fix(theme): added badge for default-shipping and default-sbilling address * fix(composables): sort addresses, put default shipping and billing address to top * fix(theme): default billing and shipping text can be translated * chore(theme): added translations * fix(composables): removed console.log * chore: upgraded vsf core to 2.5.4 (#389) * chore: updated VSF core version to 2.5.4 * build: updated test GH action * fix(composables): update url resolver clearing patter to remove locale prefix (#390) Co-authored-by: Bartosz Herba * fix(theme): fix links to catch current locale (#391) * fix(theme): M2-25 fix links to catch current locale * Apply suggestions from code review Co-authored-by: Heitor Ramon Ribeiro * test(test-utils): added localePath global mock to the test-utils Co-authored-by: Bartosz Herba Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Marcin Kwiatkowski * style(theme): aligned titles in my account menu (#400) * feat(middleware): added i18n route middleware (#408) * feat(middleware): added i18n route middleware closes #378 * refactor(middleware): i18n middleware: adjustements * fix(theme): update localisation for all :link bindings (#416) Co-authored-by: Bartosz Herba * docs(theme): update custom queries documentation to be more friendly and explicit (#418) Co-authored-by: Bartosz Herba * chore(theme): removed html-validator… * build: restored composables build (#1051) * build: restored composables publish script (#1052) Co-authored-by: Aliaaaam <88658555+Aliaaaam@users.noreply.github.com> Co-authored-by: Heitor Ramon Ribeiro Co-authored-by: Bartosz Herba Co-authored-by: Bartosz Herba Co-authored-by: Kevin Gorjan Co-authored-by: Georgiy Slobodenyuk Co-authored-by: Diego Alba <72459310+Diegoalbag@users.noreply.github.com> Co-authored-by: Abdellatif EL MIZEB Co-authored-by: Abdellatif El Mizeb Co-authored-by: Frédéric Le Menach Co-authored-by: Alexander Devitsky Co-authored-by: Alexander Devitsky Co-authored-by: Filip Sobol Co-authored-by: Artur Tagisow <5359825+sethidden@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Andrzej Pawcenis Co-authored-by: Diego Alba Co-authored-by: GitHub actions Co-authored-by: Maya Shavin <6650139+mayashavin@users.noreply.github.com> Co-authored-by: Maya Shavin Co-authored-by: Filip Sobol Co-authored-by: Artur Tagisow Co-authored-by: Aapo Kiiso Co-authored-by: Alan Lisler Co-authored-by: Alan Lisler Co-authored-by: Arnoult Co-authored-by: Vitor L Cavalcanti Co-authored-by: Roz <3948961+roziscoding@users.noreply.github.com> --- .all-contributorsrc | 56 +++- docs/guide/about.md | 18 +- docs/guide/composables/use-addresses.md | 29 -- docs/guide/composables/use-billing.md | 113 ------- docs/guide/composables/use-cart.md | 186 ----------- docs/guide/composables/use-category-search.md | 63 ---- docs/guide/composables/use-category.md | 142 -------- docs/guide/composables/use-config.md | 209 ------------ docs/guide/composables/use-country-search.md | 77 ----- docs/guide/composables/use-custom-mutation.md | 84 ----- docs/guide/composables/use-custom-query.md | 87 ----- .../composables/use-external-checkout.md | 47 --- docs/guide/composables/use-facet.md | 102 ------ docs/guide/composables/use-forgot-password.md | 27 -- .../composables/use-get-shipping-methods.md | 90 ----- docs/guide/composables/use-guest-user.md | 69 ---- docs/guide/composables/use-make-oder.md | 103 ------ docs/guide/composables/use-menu-category.md | 50 --- docs/guide/composables/use-newsletter.md | 21 -- .../guide/composables/use-payment-provider.md | 80 ----- docs/guide/composables/use-product.md | 309 ------------------ .../guide/composables/use-related-products.md | 26 -- docs/guide/composables/use-review.md | 14 - .../composables/use-shipping-provider.md | 45 --- docs/guide/composables/use-shipping.md | 43 --- docs/guide/composables/use-store.md | 52 --- docs/guide/composables/use-upsell-products.md | 24 -- docs/guide/composables/use-url-resolver.md | 58 ---- docs/guide/composables/use-user-billing.md | 106 ------ docs/guide/composables/use-user-order.md | 44 --- docs/guide/composables/use-user-shipping.md | 56 ---- docs/guide/composables/use-user.md | 82 ----- docs/guide/composables/use-wishlist.md | 94 ------ docs/guide/getting-started.md | 2 +- docs/migration-guides/1.0.0-rc.7/index.md | 108 ++++++ docs/migration-guides/1.0.0-rc.7/rc.7-bic.md | 88 +++++ docs/migration-guides/index.md | 3 + internals/eslint-import/package.json | 2 +- internals/eslint-jest/package.json | 2 +- internals/eslint-typescript/package.json | 2 +- internals/eslint-vue/package.json | 2 +- internals/eslint/package.json | 2 +- package.json | 3 +- packages/api-client/README.md | 20 +- packages/api-client/package.json | 2 +- packages/composables/README.md | 20 +- packages/composables/package.json | 22 +- .../src/composables/useCustomQuery/index.ts | 4 + .../src/factories/useCustomQueryFactory.ts | 4 + packages/theme/README.md | 15 +- packages/theme/package.json | 2 +- yarn.lock | 59 +++- 52 files changed, 384 insertions(+), 2584 deletions(-) delete mode 100644 docs/guide/composables/use-addresses.md delete mode 100644 docs/guide/composables/use-billing.md delete mode 100644 docs/guide/composables/use-cart.md delete mode 100644 docs/guide/composables/use-category-search.md delete mode 100644 docs/guide/composables/use-category.md delete mode 100644 docs/guide/composables/use-config.md delete mode 100644 docs/guide/composables/use-country-search.md delete mode 100644 docs/guide/composables/use-custom-mutation.md delete mode 100644 docs/guide/composables/use-custom-query.md delete mode 100644 docs/guide/composables/use-external-checkout.md delete mode 100644 docs/guide/composables/use-facet.md delete mode 100644 docs/guide/composables/use-forgot-password.md delete mode 100644 docs/guide/composables/use-get-shipping-methods.md delete mode 100644 docs/guide/composables/use-guest-user.md delete mode 100644 docs/guide/composables/use-make-oder.md delete mode 100644 docs/guide/composables/use-menu-category.md delete mode 100644 docs/guide/composables/use-newsletter.md delete mode 100644 docs/guide/composables/use-payment-provider.md delete mode 100644 docs/guide/composables/use-product.md delete mode 100644 docs/guide/composables/use-related-products.md delete mode 100644 docs/guide/composables/use-review.md delete mode 100644 docs/guide/composables/use-shipping-provider.md delete mode 100644 docs/guide/composables/use-shipping.md delete mode 100644 docs/guide/composables/use-store.md delete mode 100644 docs/guide/composables/use-upsell-products.md delete mode 100644 docs/guide/composables/use-url-resolver.md delete mode 100644 docs/guide/composables/use-user-billing.md delete mode 100644 docs/guide/composables/use-user-order.md delete mode 100644 docs/guide/composables/use-user-shipping.md delete mode 100644 docs/guide/composables/use-user.md delete mode 100644 docs/guide/composables/use-wishlist.md create mode 100644 docs/migration-guides/1.0.0-rc.7/index.md create mode 100644 docs/migration-guides/1.0.0-rc.7/rc.7-bic.md create mode 100644 docs/migration-guides/index.md diff --git a/.all-contributorsrc b/.all-contributorsrc index 944b65f28..8b7a1f4fa 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -75,7 +75,8 @@ "avatar_url": "https://avatars.githubusercontent.com/u/789614?v=4", "profile": "https://github.com/KevinGorjan", "contributions": [ - "code" + "code", + "doc" ] }, { @@ -84,7 +85,11 @@ "avatar_url": "https://avatars.githubusercontent.com/u/16045377?v=4", "profile": "https://github.com/bartoszherba", "contributions": [ - "code" + "code", + "doc", + "maintenance", + "mentoring", + "review" ] }, { @@ -94,7 +99,13 @@ "profile": "https://github.com/Frodigo", "contributions": [ "code", - "projectManagement" + "projectManagement", + "business", + "doc", + "ideas", + "maintenance", + "mentoring", + "review" ] }, { @@ -116,7 +127,8 @@ "contributions": [ "question", "mentoring", - "review" + "review", + "doc" ] }, { @@ -158,6 +170,42 @@ "contributions": [ "code" ] + }, + { + "login": "sethidden", + "name": "Artur Tagisow", + "avatar_url": "https://avatars.githubusercontent.com/u/5359825?v=4", + "profile": "https://github.com/sethidden", + "contributions": [ + "code" + ] + }, + { + "login": "jonathanribas", + "name": "Jonathan Ribas", + "avatar_url": "https://avatars.githubusercontent.com/u/3003782?v=4", + "profile": "https://github.com/jonathanribas", + "contributions": [ + "code" + ] + }, + { + "login": "Aliaaaam", + "name": "Ali Ghanei", + "avatar_url": "https://avatars.githubusercontent.com/u/88658555?v=4", + "profile": "https://github.com/Aliaaaam", + "contributions": [ + "code" + ] + }, + { + "login": "mayashavin", + "name": "Maya Shavin", + "avatar_url": "https://avatars.githubusercontent.com/u/6650139?v=4", + "profile": "https://github.com/mayashavin", + "contributions": [ + "doc" + ] } ], "contributorsPerLine": 5 diff --git a/docs/guide/about.md b/docs/guide/about.md index 44de0c09e..684a9f953 100644 --- a/docs/guide/about.md +++ b/docs/guide/about.md @@ -9,12 +9,12 @@ ## Support -If you have any questions about this integration we will be happy to answer them on `magento2-vsf2` channel on [our Discord](discord.vuestorefront.io). +If you have any questions about this integration we will be happy to answer them on `magento2` channel on [our Discord](discord.vuestorefront.io). ## Contributors ✨ ### Honorable Mentions - +- [Caravel x](https://www.caravelx.com/) - [Cyberfuze](https://cyberfuze.com/) - [Leonex](https://www.leonex.de/) @@ -33,18 +33,24 @@ Thanks go to these wonderful people 🙌:
Patrick Monteiro

💻 -
Kevin Gorjan

💻 -
Bartosz Herba

💻 -
Marcin Kwiatkowski

💻 📆 +
Kevin Gorjan

💻 📖 +
Bartosz Herba

💻 📖 🚧 🧑‍🏫 👀 +
Marcin Kwiatkowski

💻 📆 💼 📖 🤔 🚧 🧑‍🏫 👀
Filip Rakowski

💬 🧑‍🏫 👀 -
Filip Sobol

💬 🧑‍🏫 👀 +
Filip Sobol

💬 🧑‍🏫 👀 📖
Patryk Andrzejewski

💬 🧑‍🏫 👀
Renan Oliveira

🔧 🔌
Dominik Deimel

💻 📖
Lior Lindvor

💻 + +
Artur Tagisow

💻 +
Jonathan Ribas

💻 +
Ali Ghanei

💻 +
Maya Shavin

📖 + diff --git a/docs/guide/composables/use-addresses.md b/docs/guide/composables/use-addresses.md deleted file mode 100644 index 5f5662cc5..000000000 --- a/docs/guide/composables/use-addresses.md +++ /dev/null @@ -1,29 +0,0 @@ -# useAddresses - -`useAddresses`: - -## API -```typescript -export interface UseAddresses extends Composable { - error: ComputedProperty; - loading: ComputedProperty; - addresses: ComputedProperty; - load: (loadParams?: LOAD_ADDRESS_PARAMS) => Promise, - save: (saveParams: SAVE_ADDRESS_PARAMS) => Promise, - remove: (removeParams: REMOVE_ADDRESS_PARAMS) => Promise, - update: (updateParams: UPDATE_ADDRESS_PARAMS) => Promise, -} -``` - -* `` - - -## Example - -```javascript -``` diff --git a/docs/guide/composables/use-billing.md b/docs/guide/composables/use-billing.md deleted file mode 100644 index ccf376c73..000000000 --- a/docs/guide/composables/use-billing.md +++ /dev/null @@ -1,113 +0,0 @@ -# useBilling - -## Features -`useBilling` composable can be used to: -* fetch existing billing addresses, -* submit new billing addresses, -* modify and delete existing billing addresses. - -## API - -### `load` -Function that takes in `CustomQuery` as optional params and gets the `billing` accordingly - -### `billing` -Returns `billing` as a `computed` property -```typescript -// packages/composables/src/composables/useBilling/index.ts -export default useBillingFactory(factoryParams); - -// packages/api-client/src/types/GraphQL.ts -interface BillingCartAddress { - city: Scalars['String']; - company?: Maybe; - country: CartAddressCountry; - firstname: Scalars['String']; - lastname: Scalars['String']; - postcode?: Maybe; - region?: Maybe; - street: Array>; - telephone: Scalars['String']; -} -``` - -### `save` -Saves new address - -### `loading` -Returns the `loading` state of `search` - -### `error` -reactive object containing the error message, if search failed for any reason. - -## Getters -* `getAddresses` - returns list of billing addresses. -* `getDefault` - returns a default billing address. -* `getTotal` - returns total number of billing addresses user has. -* `getId` - returns id from an individual address. -* `getPostCode` - returns post code from an individual address. -* `getStreetName` - returns street name from an individual address. -* `getStreetNumber` - returns street number from an individual address. -* `getCity` - returns city name from an individual address. -* `getFirstName` - returns first name from an individual address. -* `getLastName` - returns last name from an individual address. -* `getCountry` - returns country name from an individual address. -* `getPhone` - return phone number from an individual address. -* `getEmail` - returns e-mail address from an individual address. -* `getProvince` - returns province (state) from an individual address. -* `getCompanyName` - returns company name from an individual address. -* `getTaxNumber` - returns tax number from an individual address. -* `getApartmentNumber` - returns apartment number from an individual address. -* `isDefault` - return information if address is current default. - -```typescript -interface UserBillingGetters { - getAddresses: (billing, criteria?: Record) => any[]; - getDefault: (billing) => any; - getTotal: (billing) => number; - getPostCode: (address) => string; - getStreetName: (address) => string; - getStreetNumber: (address) => string | number; - getCity: (address) => string; - getFirstName: (address) => string; - getLastName: (address) => string; - getCountry: (address) => string; - getPhone: (address) => string; - getEmail: (address) => string; - getProvince: (address) => string; - getCompanyName: (address) => string; - getTaxNumber: (address) => string; - getId: (address) => string; - getApartmentNumber: (address) => string | number; - isDefault: (address) => boolean; -} -``` - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useBilling, userBillingGetters } from '@vue-storefront/magento'; - -export default { - setup() { - const { - billing, - load, - addAddress, - deleteAddress, - updateAddress - } = useBilling(); - - // If you're using Nuxt or any other framework for Universal Vue apps - onSSR(async () => { - await load(); - }); - - return { - billing: computed(() => userBillingGetters.getAddresses(billing.value)), - userBillingGetters - }; - } -}; -``` diff --git a/docs/guide/composables/use-cart.md b/docs/guide/composables/use-cart.md deleted file mode 100644 index df12e35b3..000000000 --- a/docs/guide/composables/use-cart.md +++ /dev/null @@ -1,186 +0,0 @@ -# useCart - -## Features -`useCart` composable can be used to: -* load cart information, -* add, update and remove items in the cart, -* applying and removing coupons, -* checking if product is already added to the cart. - -## API -```typescript -interface UseCart { - cart: ComputedProperty; - setCart(cart: Cart): void; - addItem(params: { - product: Product; - quantity: number; - customQuery?: CustomQuery; - }): Promise; - isInCart: ({ product: Product }: { - product: any; - }) => boolean; - removeItem(params: { - product: CartItem; - customQuery?: CustomQuery; - }): Promise; - updateItemQty(params: { - product: CartItem; - quantity?: number; - customQuery?: CustomQuery; - }): Promise; - clear(): Promise; - applyCoupon(params: { - couponCode: string; - customQuery?: CustomQuery; - }): Promise; - removeCoupon(params: { - coupon: Coupon; - customQuery?: CustomQuery; - }): Promise; - load(): Promise; - load(params: { - customQuery?: CustomQuery; - }): Promise; - error: ComputedProperty; - loading: ComputedProperty; -} - -export interface Cart { - /** - * An array of coupons that have been applied to the cart - * @deprecated Use applied_coupons instead - */ - applied_coupon?: Maybe; - /** An array of `AppliedCoupon` objects. Each object contains the `code` text attribute, which specifies the coupon code */ - applied_coupons?: Maybe>>; - /** Available payment methods */ - available_payment_methods?: Maybe>>; - billing_address?: Maybe; - email?: Maybe; - /** The entered gift message for the cart */ - gift_message?: Maybe; - /** The unique ID for a `Cart` object */ - id: Scalars['ID']; - is_virtual: Scalars['Boolean']; - items?: Maybe>>; - prices?: Maybe; - selected_payment_method?: Maybe; - shipping_addresses: Array>; - total_quantity: Scalars['Float']; -} - -export interface CartItem { - prices?: Maybe; - product: ProductInterface; - quantity: Scalars['Float']; - /** The unique ID for a `CartItemInterface` object */ - uid: Scalars['ID']; -} - -export interface Coupon { - code: Scalars['String']; -} - -``` -> For more information on [Product interface](use-product) visit the dedicated documentation. - - -### `cart` -Returns the Items in the Cart as a `computed` property - -### `setCart` -set new Cart - -### `addItem` -Function that takes in a `product` and its `quantity` and adds it to the cart - -### `isInCart` -Function that takes in a `product` and returns `true` or `false` - -### `removeItem` -Function that takes in a `product` and removes it from the `cart` - -### `updateItemQty` -Function that takes in a `product` and its new `quantaty` and updates it accordingly - -### `clear` -Function that clears cart - -### `applyCoupon` -Function that takes in a `coupon` and applies it to the cart - -### `removeCoupon` -Function that removes all applied coupons - -### `load` -Function that loads the current `cart` - -### `error` -reactive object containing the error message, if some properties failed for any reason. - -### `loading` -a reactive object containing information about loading state of the cart. - - -## Getters - -````typescript -interface CartGetters { - getItems: (cart: Cart) => CartItem[]; - getItemName: (cartItem: CartItem) => string; - getItemImage: (cartItem: CartItem) => string; - getItemPrice: (cartItem: CartItem) => AgnosticPrice; - getItemQty: (cartItem: CartItem) => number; - getItemAttributes: ( - cartItem: CartItem, - _filterByAttributeName?: Array, - ) => Record; - getItemSku: (cartItem: CartItem) => string; - getTotals: (cart: Cart) => AgnosticTotals; - getShippingPrice: (cart: Cart) => number; - getTotalItems: (cart: Cart) => number; - getFormattedPrice: (price: number) => string; - getCoupons: (cart: Cart) => AgnosticCoupon[]; - getDiscounts: (cart: Cart) => AgnosticDiscount[]; -} -```` - -* `getItems` - returns all items from cart. -* `getItemName` - returns product name. -* `getItemImage` - returns product image. -* `getItemPrice` - returns product price. -* `getItemQty` - returns product quantity. -* `getItemAttributes` - returns product attribute. -* `getItemSku` - returns product SKU. -* `getTotals` - returns cart totals. -* `getShippingPrice` - returns current shipping price. -* `getTotalItems` - returns products amount. -* `getFormattedPrice` - returns product price with currency sign. -* `getCoupons` - returns applied coupons. -* `getDiscounts` - returns all discounts. - -## Example - -```javascript -import { useCart, cartGetters } from '@vue-storefront/magento'; -import { onSSR } from '@vue-storefront/core' - -export default { - setup () { - const { cart, removeItem, updateItemQty, load } = useCart(); - - onSSR(async () => { - await load(); - }) - - return { - removeItem, - updateItemQty, - products: computed(() => cartGetters.getItems(cart.value)), - totals: computed(() => cartGetters.getTotals(cart.value)), - totalItems: computed(() => cartGetters.getTotalItems(cart.value)) - } - } -} -``` diff --git a/docs/guide/composables/use-category-search.md b/docs/guide/composables/use-category-search.md deleted file mode 100644 index 6808916d3..000000000 --- a/docs/guide/composables/use-category-search.md +++ /dev/null @@ -1,63 +0,0 @@ -# useCategorySearch - -## Features -`useCategorySearch` composable is responsible for fetching a list of categories based on search term provided. A common usage scenario for this composable is navigation subtrees. - -## API -The `useCategorySearch` composable implements custom factory `useCategorySearchFactory` located in `packages/composables/src/factories/useCategorySearchFactory.ts` and returns `UseCategorySearch` interface: - -```typescript -export interface UseCategorySearch { - search: (params: { term: string }) => Promise; - result: ComputedProperty; - error: ComputedProperty; - loading: ComputedProperty; -} - -export interface UseCategorySearchErrors { - search: Error; -} -``` -> For more information on [Category interface](use-category) visit the dedicated documentation. - -### `search` -Function that takes `term` as search param and gets the `categories` accordingly - -### `result` -Returns an array of categories fetched by `search` method as a `computed` property. -See [useCategory](use-category.html) for more information on `categories` interface - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useCategorySearch } from '@vue-storefront/magento'; - -export default { - setup () { - const { - loading, - error, - result: categories, - search: categoriesSearch, - } = useCategorySearch('AppHeader:Categories'); - - onSSR(async () => { - await categoriesSearch({ - term: 'value', - }); - }); - - return { - categories, - loading, - error, - } - } -} -``` diff --git a/docs/guide/composables/use-category.md b/docs/guide/composables/use-category.md deleted file mode 100644 index 51c7a603e..000000000 --- a/docs/guide/composables/use-category.md +++ /dev/null @@ -1,142 +0,0 @@ -# useCategory - -## Features -`useCategory` composable is responsible for fetching a list of categories. A common usage scenario for this composable is navigation. - -## API -```typescript -interface UseCategory { - categories: ComputedProperty; - search(params: ComposableFunctionArgs): Promise; - loading: ComputedProperty; - error: ComputedProperty; -} - -export type CategoryListQueryVariables = Exact<{ [key: string]: never; }>; - -export interface Category { - available_sort_by?: Maybe>>; - /** Breadcrumbs, parent categories info. */ - breadcrumbs?: Maybe>>; - /** Relative canonical URL. This value is returned only if the system setting 'Use Canonical Link Meta Tag For Categories' is enabled */ - canonical_url?: Maybe; - /** Child categories tree. */ - children?: Maybe>>; - children_count?: Maybe; - /** Category CMS Block. */ - cms_block?: Maybe; - /** - * Timestamp indicating when the category was created. - * @deprecated The field should not be used on the storefront. - */ - created_at?: Maybe; - custom_layout_update_file?: Maybe; - /** The attribute to use for sorting. */ - default_sort_by?: Maybe; - /** An optional description of the category. */ - description?: Maybe; - display_mode?: Maybe; - filter_price_range?: Maybe; - /** - * An ID that uniquely identifies the category. - * @deprecated Use the `uid` argument instead. - */ - id?: Maybe; - image?: Maybe; - include_in_menu?: Maybe; - is_anchor?: Maybe; - landing_page?: Maybe; - /** Indicates the depth of the category within the tree. */ - level?: Maybe; - meta_description?: Maybe; - meta_keywords?: Maybe; - meta_title?: Maybe; - /** The display name of the category. */ - name?: Maybe; - /** Category Path. */ - path?: Maybe; - /** Category path in store. */ - path_in_store?: Maybe; - /** The position of the category relative to other categories at the same level in tree. */ - position?: Maybe; - /** The number of products in the category that are marked as visible. By default, in complex products, parent products are visible, but their child products are not. */ - product_count?: Maybe; - /** The list of products assigned to the category. */ - products?: Maybe; - /** The unique ID for a `CategoryInterface` object. */ - uid: Scalars['ID']; - /** - * Timestamp indicating when the category was updated. - * @deprecated The field should not be used on the storefront. - */ - updated_at?: Maybe; - /** The url key assigned to the category. */ - url_key?: Maybe; - /** The url path assigned to the category. */ - url_path?: Maybe; - /** The part of the category URL that is appended after the url key */ - url_suffix?: Maybe; -} -``` - -### `search` -Function that takes `CategoryListQueryVariables`as optional param and gets the `categories` accordingly - -### `categories` -Returns an array of categories fetched by `search` method as a `computed` property. - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Getters -````typescript -interface CategoryGetters { - getTree: (category: Category) => AgnosticCategoryTree | null; - getBreadcrumbs: (category: Category) => AgnosticBreadcrumb[]; - getCategoryTree?: ( - category: Category, - currentCategory: string, - withProducts: boolean, - ) => AgnosticCategoryTree | null; -} - -export interface AgnosticBreadcrumb { - text: string; - link: string; -} - -export interface AgnosticCategoryTree { - label: string; - slug?: string; - items: AgnosticCategoryTree[]; - isCurrent: boolean; - count?: number; - [x: string]: unknown; -} -```` -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useCategory } from '@vue-storefront/magento'; - -export default { - setup () { - const { categories, search, loading } = useCategory('AppHeader:Categories'); - - onSSR(async () => { - await search({ - pageSize: 100, - }); - }); - - return { - categories, - loading - } - } -} -``` diff --git a/docs/guide/composables/use-config.md b/docs/guide/composables/use-config.md deleted file mode 100644 index c48f7288e..000000000 --- a/docs/guide/composables/use-config.md +++ /dev/null @@ -1,209 +0,0 @@ -# useConfig - -## Features -`useConfig` composable is responsible, as its name suggests, for interactions with the configuration in your eCommerce. - -## API -The `useConfig` composable implements custom factory `useConfigFactory` located in `packages/composables/src/factories/useConfigFactory.ts` and returns `UseConfig` interface: -```typescript -interface UseConfig { - config: ComputedRef; - loadConfig: () => Promise; - loading: ComputedRef; -} - -export interface StoreConfig { - /** Footer Miscellaneous HTML */ - absolute_footer?: Maybe; - /** Indicates whether guest users can write product reviews. Possible values: 1 (Yes) and 0 (No) */ - allow_guests_to_write_product_reviews?: Maybe; - /** The value of the Allow Gift Messages for Order Items option */ - allow_items?: Maybe; - /** The value of the Allow Gift Messages on Order Level option */ - allow_order?: Maybe; - /** Enable autocomplete on login and forgot password forms */ - autocomplete_on_storefront?: Maybe; - /** Base currency code */ - base_currency_code?: Maybe; - /** Base link URL for the store */ - base_link_url?: Maybe; - /** Base media URL for the store */ - base_media_url?: Maybe; - /** Base static URL for the store */ - base_static_url?: Maybe; - /** Base URL for the store */ - base_url?: Maybe; - /** Braintree cc vault status. */ - braintree_cc_vault_active?: Maybe; - /** Default Sort By. */ - catalog_default_sort_by?: Maybe; - /** Corresponds to the 'Display Prices In Product Lists' field. It indicates how FPT information is displayed on category pages */ - category_fixed_product_tax_display_setting?: Maybe; - /** Category URL Suffix. */ - category_url_suffix?: Maybe; - /** CMS Home Page */ - cms_home_page?: Maybe; - /** CMS No Cookies Page */ - cms_no_cookies?: Maybe; - /** CMS No Route Page */ - cms_no_route?: Maybe; - /** - * A code assigned to the store to identify it - * @deprecated Use `store_code` instead. - */ - code?: Maybe; - /** The configuration setting determines which thumbnail should be used in the cart for configurable products. */ - configurable_thumbnail_source?: Maybe; - /** Copyright */ - copyright?: Maybe; - /** Default Meta Description */ - default_description?: Maybe; - /** Default display currency code */ - default_display_currency_code?: Maybe; - /** Default Meta Keywords */ - default_keywords?: Maybe; - /** Default Page Title */ - default_title?: Maybe; - /** Display Demo Store Notice */ - demonotice?: Maybe; - /** Default Web URL */ - front?: Maybe; - /** Products per Page on Grid Default Value. */ - grid_per_page?: Maybe; - /** Products per Page on Grid Allowed Values. */ - grid_per_page_values?: Maybe; - /** Scripts and Style Sheets */ - head_includes?: Maybe; - /** Favicon Icon */ - head_shortcut_icon?: Maybe; - /** Logo Image */ - header_logo_src?: Maybe; - /** - * The ID number assigned to the store - * @deprecated Use `store_code` instead. - */ - id?: Maybe; - /** Indicates whether the store view has been designated as the default within the store group */ - is_default_store?: Maybe; - /** Indicates whether the store group has been designated as the default within the website */ - is_default_store_group?: Maybe; - /** List Mode. */ - list_mode?: Maybe; - /** Products per Page on List Default Value. */ - list_per_page?: Maybe; - /** Products per Page on List Allowed Values. */ - list_per_page_values?: Maybe; - /** Store locale */ - locale?: Maybe; - /** Logo Image Alt */ - logo_alt?: Maybe; - /** Logo Attribute Height */ - logo_height?: Maybe; - /** Logo Attribute Width */ - logo_width?: Maybe; - /** Indicates whether wishlists are enabled (1) or disabled (0) */ - magento_wishlist_general_is_enabled?: Maybe; - /** The minimum number of characters required for a valid password. */ - minimum_password_length?: Maybe; - /** Default No-route URL */ - no_route?: Maybe; - /** Payflow Pro vault status. */ - payment_payflowpro_cc_vault_active?: Maybe; - /** Corresponds to the 'Display Prices On Product View Page' field. It indicates how FPT information is displayed on product pages */ - product_fixed_product_tax_display_setting?: Maybe; - /** Indicates whether product reviews are enabled. Possible values: 1 (Yes) and 0 (No) */ - product_reviews_enabled?: Maybe; - /** Product URL Suffix. */ - product_url_suffix?: Maybe; - /** The number of different character classes required in a password (lowercase, uppercase, digits, special characters). */ - required_character_classes_number?: Maybe; - /** - * The ID of the root category - * @deprecated Use `root_category_uid` instead - */ - root_category_id?: Maybe; - /** The unique ID for a `CategoryInterface` object. */ - root_category_uid?: Maybe; - /** Corresponds to the 'Display Prices In Sales Modules' field. It indicates how FPT information is displayed on cart, checkout, and order pages */ - sales_fixed_product_tax_display_setting?: Maybe; - /** Secure base link URL for the store */ - secure_base_link_url?: Maybe; - /** Secure base media URL for the store */ - secure_base_media_url?: Maybe; - /** Secure base static URL for the store */ - secure_base_static_url?: Maybe; - /** Secure base URL for the store */ - secure_base_url?: Maybe; - /** Email to a Friend configuration. */ - send_friend?: Maybe; - /** Show Breadcrumbs for CMS Pages */ - show_cms_breadcrumbs?: Maybe; - /** The unique ID of the store view. In the Admin, this is called the Store View Code. When making a GraphQL call, assign this value to the `Store` header to provide the scope */ - store_code?: Maybe; - /** The unique ID assigned to the store group. In the Admin, this is called the Store Name */ - store_group_code?: Maybe; - /** The label assigned to the store group */ - store_group_name?: Maybe; - /** The label assigned to the store view */ - store_name?: Maybe; - /** The store view sort order */ - store_sort_order?: Maybe; - /** Timezone of the store */ - timezone?: Maybe; - /** Page Title Prefix */ - title_prefix?: Maybe; - /** Page Title Separator. */ - title_separator?: Maybe; - /** Page Title Suffix */ - title_suffix?: Maybe; - /** The configuration determines if the store code should be used in the URL */ - use_store_in_url?: Maybe; - /** The unique ID for the website */ - website_code?: Maybe; - /** - * The ID number assigned to the website store - * @deprecated The field should not be used on the storefront - */ - website_id?: Maybe; - /** The label assigned to the website */ - website_name?: Maybe; - /** The unit of weight */ - weight_unit?: Maybe; - /** Welcome Text */ - welcome?: Maybe; -} -``` - -### `config` -Returns the loaded `config` as `computed` property - -### `loadConfig` -Function to load the `config` - -### `loading` -Return state of `loadConfig` Function as `computed` property - -## Example -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useConfig } from '@vue-storefront/magento'; - -export default { - setup() { - const { - config, - loadConfig, - loading - } = useConfig(); - - onSSR(async () => { - await loadConfig(); - }) - - return { - config, - loading - }; - } -}; -``` diff --git a/docs/guide/composables/use-country-search.md b/docs/guide/composables/use-country-search.md deleted file mode 100644 index e5e78f711..000000000 --- a/docs/guide/composables/use-country-search.md +++ /dev/null @@ -1,77 +0,0 @@ -# useCountrySearch - -## Features -`useCountrySearch` composable is responsible for fetching a list of categories. A common usage scenario for this composable is navigation. - -## API -The `useCountrySearch` composable implements custom factory `useCountrySearchFactory` located in `packages/composables/src/composables/useCountrySearch/index.ts` and returns `UseCountrySearch` interface: -```typescript -export interface UseCountrySearch { - load: () => Promise; - search: (params: { id: string }) => Promise; - countries: ComputedProperty; - country: ComputedProperty; - error: ComputedProperty; - loading: ComputedProperty; -} - -export type Countries = CountriesListQuery['countries'][0]; - -export interface Country { - available_regions?: Maybe>>; - full_name_english?: Maybe; - full_name_locale?: Maybe; - /** The unique ID for a `Country` object. */ - id?: Maybe; - three_letter_abbreviation?: Maybe; - two_letter_abbreviation?: Maybe; -} -``` - -### `load` -Function that takes no params and gets the `Countries` array accordingly - -### `search` -Function that takes `id`as search param and gets the `Country` accordingly - -### `countries` -Returns an array of countries fetched by `load` method as a `computed` property. - -### `country` -Returns a single `Country` object fetched by `search` method as a `computed` property. - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useCountrySearch } from '@vue-storefront/magento'; - -export default { - setup (props) { - const { - load: loadCountries, - countries, - search: searchCountry, - country, - } = useCountrySearch('Step:Billing'); - - onSSR(async () => { - await searchCountry({ - id: props.identifier, - }); - }); - - return { - loadCountries, - countries, - country, - } - } -} -``` diff --git a/docs/guide/composables/use-custom-mutation.md b/docs/guide/composables/use-custom-mutation.md deleted file mode 100644 index 1c983d1b3..000000000 --- a/docs/guide/composables/use-custom-mutation.md +++ /dev/null @@ -1,84 +0,0 @@ -# useCustomMutation - -## Features -`useCustomMutation` composition function can be used to execute custom Mutation on the Magento GraphQL API. - -What makes it powerful is the ability to accept any GraphQL mutation, and execute it. - -## API -```typescript -export interface UseCustomMutation extends Composable { - setMutationString: (newMutationString: string) => void; - mutationString: ComputedProperty; - mutation: ({ variables, fetchPolicy }: { - variables: MUTATION_VARIABLES, - fetchPolicy?: FetchPolicy, - }) => Promise; - result: ComputedProperty; - loading: ComputedProperty; - error: ComputedProperty; - [x: string]: any; -} -``` - -### `setMutationString` -Function to define the mutation to be executed on the GraphQL Mutation - -### `mutationString` -`sharedRef` of the GraphQL mutation string - -### `query` -Actual query function to mutate the data under the Magento GraphQL API. - -### `result` -Reactive object containing the result information from mutation method. - -### `loading` -Reactive object containing the loading state of the query function. - -### `error` -Reactive object containing the error message, if mutation failed for any reason. - -## Example -`customMutationExample.ts` - -```typescript -import { useCustomMutation } from '@vue-storefront/magento'; - -export const customMutation = (id?: string) => { - const { - error, - loading, - mutation, - result, - setMutationString, - } = useCustomMutation(id); - - setMutationString(` - mutation subscribeEmailToNewsletter($email: String!){ - subscribeEmailToNewsletter(email: $email) { - status - } - }`); - - return { - error, - loading, - mutation, - result, - }; -}; -``` - -`Any File` -```typescript -import { customQuery } from '~/composables/customMutationExample.ts'; - -const { mutation } = customQuery(id); - -await mutation({ - variables: { - email: `${newEmail}`, - }, -}); -``` diff --git a/docs/guide/composables/use-custom-query.md b/docs/guide/composables/use-custom-query.md deleted file mode 100644 index dda849fd1..000000000 --- a/docs/guide/composables/use-custom-query.md +++ /dev/null @@ -1,87 +0,0 @@ -# useCustomQuery - -## Features -`useCustomQuery` composition function can be used to execute custom Queries on the Magento GraphQL API. - -What makes it powerful is the ability to accept any GraphQL query, and execute it. - -## API -```typescript -export interface UseCustomQuery extends Composable { - setQueryString: (newQueryString: string) => void; - queryString: ComputedProperty; - query: ({ variables, fetchPolicy, }: { - variables: QUERY_VARIABLES, - fetchPolicy?: FetchPolicy, - }) => Promise; - result: ComputedProperty; - loading: ComputedProperty; - error: ComputedProperty; -} -``` - -### `setQueryString` -Function to define the query to be executed on the GraphQL Query - -### `queryString` -`sharedRef` of the GraphQL query string - -### `query` -Actual query function to fetch the data under the Magento GraphQL API. - -### `result` -Reactive object containing the result information from query method. - -### `loading` -Reactive object containing the loading state of the query function. - -### `error` -Reactive object containing the error message, if query failed for any reason. - -## Example -`customQueryExample.ts` - -```typescript -import { useCustomQuery } from '@vue-storefront/magento'; - -export const customQuery = (id?: string) => { - const { - error, - loading, - query, - result, - setQueryString, - } = useCustomQuery(id); - - setQueryString(` - query urlResolver($url: String!) { - urlResolver(url:$url) { - id, - redirectCode, - relative_url, - type - entity_uid - } - }`); - - return { - error, - loading, - query, - result, - }; -}; -``` - -`Any File` -```typescript -import { customQuery } from '~/composables/customQueryExample.ts'; - -const { query } = customQuery(path); - -await query({ - variables: { - url: path.replace(/\/[cp|]\//gi, ''), - }, -}); -``` diff --git a/docs/guide/composables/use-external-checkout.md b/docs/guide/composables/use-external-checkout.md deleted file mode 100644 index b4b31bd1d..000000000 --- a/docs/guide/composables/use-external-checkout.md +++ /dev/null @@ -1,47 +0,0 @@ -# useExternalCheckout - -## Features -`useExternalCheckout` composable is responsible for redirecting checkout process and depends on [Magento 2 External Checkout for Vue Storefront](https://github.com/Vendic/magento2-external-checkout) repository. - -## API -The `useExternalCheckout` composable implements custom factory `useExternalCheckoutFactory` located in `packages/composables/src/factories/useExternalCheckoutFactory.ts` and returns `UseExternalCheckout` interface: -```typescript -export interface UseExternalCheckout { - initializeCheckout: (baseUrl: string) => Promise; - error: ComputedProperty; - loading: ComputedProperty; -} - -export interface UseExternalCheckoutErrors { - initializeCheckout: Error; -} -``` -### `initializeCheckout` -Function that takes `baseUrl`as search param. - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example - -```javascript -import { useExternalCheckout } from '@vue-storefront/magento'; - -export default { - setup (props) { - const { initializeCheckout } = useExternalCheckout(); - - const goToCheckout = async () => { - const redirectUrl = await initializeCheckout('/checkout/user-account'); - await router.push(redirectUrl); - }; - - return { - goToCheckout, - } - } -} -``` diff --git a/docs/guide/composables/use-facet.md b/docs/guide/composables/use-facet.md deleted file mode 100644 index 1ff36d2dc..000000000 --- a/docs/guide/composables/use-facet.md +++ /dev/null @@ -1,102 +0,0 @@ -# useFacet - -## Features -`useFacet` composition function can be used to fetch data related to: -* products, -* categories, -* breadcrumbs. - -What makes it powerful is the ability to accept multiple filters, allowing to narrow down the results to a specific category, search term, etc. - -## API -```typescript -interface UseFacet { - result: ComputedProperty>; - loading: ComputedProperty; - search: (params?: AgnosticFacetSearchParams) => Promise; - error: ComputedProperty; -} -``` - -### `search` -Function for searching and classifying records, allowing users to browse the catalog data. It accepts a single object as a parameter -```typescript -interface AgnosticFacetSearchParams { - categorySlug?: string; - rootCatSlug?: string; - term?: string; - page?: number; - itemsPerPage?: number; - sort?: string; - filters?: Record; - metadata?: any; - [x: string]: any; -} -``` - -### `result` -Reactive data object containing the response from the backend. - -### `loading` -Reactive object containing information about the loading state of search. - -### `error` -Reactive object containing the error message, if search failed for any reason. - - -## Getters -````typescript -interface FacetsGetters { - getAll: (searchData: FacetSearchResult, criteria?: CRITERIA) => AgnosticFacet[]; - getGrouped: (searchData: FacetSearchResult, criteria?: CRITERIA) => AgnosticGroupedFacet[]; - getCategoryTree: (searchData: FacetSearchResult) => AgnosticCategoryTree; - getSortOptions: (searchData: FacetSearchResult) => AgnosticSort; - getProducts: (searchData: FacetSearchResult) => RESULTS; - getPagination: (searchData: FacetSearchResult) => AgnosticPagination; - getBreadcrumbs: (searchData: FacetSearchResult) => AgnosticBreadcrumb[]; -} -```` - -* `getAll` - returns all available facets. -* `getGrouped` - returns grouped facets by facet name. -* `getCategoryTree` - return the tree of nested categories. -* `getSortOptions` - returns available and currently selected sorting options. -* `getProducts` - returns products matching current filters. -* `getPagination` - returns pagination information. -* `getBreadcrumbs` - returns breadcrumbs information. - -## Example -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useFacet, facetGetters } from '@vue-storefront/magento'; - -export default { - setup (props, context) { - const { result, search, loading } = useFacet(`facetId:${path}`); - - const products = computed(() => facetGetters.getProducts(result.value)); - const breadcrumbs = computed(() => facetGetters.getBreadcrumbs(result.value)); - const sortBy = computed(() => facetGetters.getSortOptions(result.value)); - const facets = computed(() => facetGetters.getGrouped(result.value)); - const pagination = computed(() => facetGetters.getPagination(result.value)); - - onSSR(async () => { - await search({ - categorySlug: 'clothing', - sort: 'latest', - itemsPerPage: 10, - term: 'some search query' - }); - }); - - return { - produproducts, - breadcrumbs, - sortBy, - facets, - pagination, - loading, - }; - } -} -``` diff --git a/docs/guide/composables/use-forgot-password.md b/docs/guide/composables/use-forgot-password.md deleted file mode 100644 index c356323f1..000000000 --- a/docs/guide/composables/use-forgot-password.md +++ /dev/null @@ -1,27 +0,0 @@ -# useForgotPassword - -`useForgotPassword` - -## API -```typescript -export interface UseForgotPassword { - result: ComputedProperty; - loading: ComputedProperty; - error: ComputedProperty; - setNew(params: ComposableFunctionArgs<{ - tokenValue: string, - newPassword: string, - email: string, - }>): Promise; - request(params: ComposableFunctionArgs<{ - email: string - }>): Promise; -} -``` - -* `` - - -## Example - -```javascript -``` diff --git a/docs/guide/composables/use-get-shipping-methods.md b/docs/guide/composables/use-get-shipping-methods.md deleted file mode 100644 index 5bcb6515a..000000000 --- a/docs/guide/composables/use-get-shipping-methods.md +++ /dev/null @@ -1,90 +0,0 @@ -# useGetShippingMethods - -## Features -`useGetShippingMethods` composable is responsible for fetching a Shipping Method - -## API -The `useGetShippingMethods` composable implements custom factory `useGetShippingMethodsFactory` located in `packages/composables/src/factories/useGetShippingMethodsFactory.ts` and returns `UseGetShippingMethods` interface: -```typescript -export interface UseGetShippingMethods { - state: ComputedProperty; - setState(state: ShippingMethod[]): void; - load: (params: { cartId: string }) => Promise; - result: ComputedProperty; - error: ComputedProperty; - loading: ComputedProperty; -} - -export type ShippingMethod = AvailableShippingMethod; - -export interface AvailableShippingMethod { - amount: Money; - available: Scalars['Boolean']; - /** @deprecated The field should not be used on the storefront */ - base_amount?: Maybe; - carrier_code: Scalars['String']; - carrier_title: Scalars['String']; - error_message?: Maybe; - /** Could be null if method is not available */ - method_code?: Maybe; - /** Could be null if method is not available */ - method_title?: Maybe; - price_excl_tax: Money; - price_incl_tax: Money; -} - -export interface Money { - /** A three-letter currency code, such as USD or EUR */ - currency?: Maybe; - /** A number expressing a monetary value */ - value?: Maybe; -} -``` -### `state` -Get all `ShippingMethods` as array. - -### `setState` -Set one or more `ShippingMethods` state. - -### `load` -Function that takes `cartId` as param and gets the `result` array accordingly - -### `result` -Returns a list of `ShippingMethods` fetched by `load` method as a `computed` property. - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useGetShippingMethods } from '@vue-storefront/magento'; - -export default { - setup (props) { - const { - load, - result: shippingMethods, - loading: loadingShippingMethods, - error: errorUseGetShippingMethods, - } = useGetShippingMethods('VsfShippingProvider'); - - - onSSR(async () => { - await load({ - cartId: props.identifier, - }); - }); - - return { - shippingMethods, - loadingShippingMethods, - errorUseGetShippingMethods, - } - } -} -``` diff --git a/docs/guide/composables/use-guest-user.md b/docs/guide/composables/use-guest-user.md deleted file mode 100644 index 26a1e4e14..000000000 --- a/docs/guide/composables/use-guest-user.md +++ /dev/null @@ -1,69 +0,0 @@ -# useGuestUser - -## Features -`useGuestUser` composable is responsible for fetching a Shipping Method - -## API -The `useGuestUser` composable implements custom factory `useGuestUserFactory` located in `packages/composables/src/factories/useGuestUserFactory.ts` and returns `UseGuestUser` interface: -```typescript -export interface UseGuestUser { - guestUser: ComputedProperty; - setGuestUser: (user: any) => void; - attachToCart: (params: { user: UseGuestUserRegisterParams }) => Promise; - loading: ComputedProperty; - error: ComputedProperty; -} - -export interface UseGuestUserRegisterParams { - email: string; - password: string; - firstName?: string; - lastName?: string; - [x: string]: any; -} - -export interface UseGuestUserErrors { - attachToCart: Error; -} -``` -### `guestUser` -Returns a User as a computed property - -### `setGuestUser` -Set the User - -### `attachToCart` -Function that takes `user` as `UseGuestUserRegisterParams` param. - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useGuestUser } from '@vue-storefront/magento'; - -export default { - setup (props) { - const { - attachToCart, - loading: loadingGuestUser, - error: errorGuestUser, - } = useGuestUser(); - - const handleFormSubmit = () => async () => { - await attachToCart({ user: props.user }); - }; - - return { - handleFormSubmit, - loadingGuestUser, - errorGuestUser, - } - } -} -``` diff --git a/docs/guide/composables/use-make-oder.md b/docs/guide/composables/use-make-oder.md deleted file mode 100644 index 67b3762d1..000000000 --- a/docs/guide/composables/use-make-oder.md +++ /dev/null @@ -1,103 +0,0 @@ -# useMakeOrder -`useMakeOrder` composable is responsible for making an order - -## API -````typescript -interface UseMakeOrder { - order: Ref; - make(params: { customQuery?: CustomQuery }): Promise; - error: ComputedProperty; - loading: ComputedProperty; -} - -export interface Order extends OrderItem { - /** @deprecated The order_id field is deprecated, use order_number instead. */ - order_id?: Maybe; - /** The unique ID for a `Order` object. */ - order_number: Scalars['String']; -} - -export interface OrderItem { - /** The final discount information for the product */ - discounts?: Maybe>>; - /** The entered option for the base product, such as a logo or image */ - entered_options?: Maybe>>; - /** The unique ID for a `OrderItemInterface` object */ - id: Scalars['ID']; - /** The name of the base product */ - product_name?: Maybe; - /** The sale price of the base product, including selected options */ - product_sale_price: Money; - /** The SKU of the base product */ - product_sku: Scalars['String']; - /** The type of product, such as simple, configurable, etc. */ - product_type?: Maybe; - /** URL key of the base product */ - product_url_key?: Maybe; - /** The number of canceled items */ - quantity_canceled?: Maybe; - /** The number of invoiced items */ - quantity_invoiced?: Maybe; - /** The number of units ordered for this item */ - quantity_ordered?: Maybe; - /** The number of refunded items */ - quantity_refunded?: Maybe; - /** The number of returned items */ - quantity_returned?: Maybe; - /** The number of shipped items */ - quantity_shipped?: Maybe; - /** The selected options for the base product, such as color or size */ - selected_options?: Maybe>>; - /** The status of the order item */ - status?: Maybe; -} -```` -### `make` -function for making an order. This method accepts a single optional params object. - -### `order` -a main data object that contains a made order. - -### `loading` -a reactive object containing information about loading state of your make method. - -### `error` -a reactive object containing the error message, if load or save failed for any reason. - - -## Getters -````typescript -interface UserOrderGetters { - getDate: (order: Order) => string; - getId: (order: Order) => string; - getStatus: (order: Order) => string; - getPrice: (order: Order) => number; - getItems: (order: Order) => OrderItem[]; - getItemSku: (item: OrderItem) => string; - getItemName: (item: OrderItem) => string; - getItemQty: (item: OrderItem) => number; - getItemPrice: (item: OrderItem) => number; - getFormattedPrice: (price: number) => string; -} -```` - -## Example -````javascript -import { useMakeOrder } from '@vue-storefront/magento'; -export default { - setup () { - const { order, make, loading } = useMakeOrder(); - - const processOrder = async () => { - await make(); - router.push(`/checkout/thank-you?order=${order.value.order_number}`); - }; - - return { - processOrder, - order, - loading, - }; - } -} -```` diff --git a/docs/guide/composables/use-menu-category.md b/docs/guide/composables/use-menu-category.md deleted file mode 100644 index 8df7a2006..000000000 --- a/docs/guide/composables/use-menu-category.md +++ /dev/null @@ -1,50 +0,0 @@ -# useMenuCategory - -## Features -`useMenuCategory` composable is responsible for fetching a list of categories with a dedicated file structure for AppHeader Menu. - -## API -```typescript -export interface UseCategory { - categories: ComputedProperty; - search(params: ComposableFunctionArgs): Promise; - loading: ComputedProperty; - error: ComputedProperty; -} - -export type CategoryMenu = CategoryTree; -``` -> For more information on [Category Tree interface](use-category) visit the dedicated documentation. - -### `search` -Function that takes `CategoryListQueryVariables` and `CustomQuery` as optional params and gets the `categories` accordingly - -### `categories` -Returns an array of categories fetched by `search` method as a `computed` property. - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useMenuCategory } from '@vue-storefront/magento'; - -export default { - setup () { - const { categories, search, loading } = useMenuCategory('category-id'); - - onSSR(async () => { - await search({}); - }); - - return { - categories, - loading - } - } -} -``` diff --git a/docs/guide/composables/use-newsletter.md b/docs/guide/composables/use-newsletter.md deleted file mode 100644 index bcfe02a81..000000000 --- a/docs/guide/composables/use-newsletter.md +++ /dev/null @@ -1,21 +0,0 @@ -# useNewsletter - -`useNewsletter` - -## API -```typescript -export interface UseNewsletter extends Composable{ - error: ComputedProperty; - loading: ComputedProperty; - updateSubscription: (params: { - email: UPDATE_NEWSLETTER_PARAMS, - }) => Promise; -} -``` - -* `` - - -## Example - -```javascript -``` diff --git a/docs/guide/composables/use-payment-provider.md b/docs/guide/composables/use-payment-provider.md deleted file mode 100644 index 7ce292458..000000000 --- a/docs/guide/composables/use-payment-provider.md +++ /dev/null @@ -1,80 +0,0 @@ -# usePaymentProvider - -## Features -`usePaymentProvider` composable is responsible for fetching a Shipping Method - -## API -The `usePaymentProvider` composable implements custom factory `usePaymentProviderFactory` located in `packages/composables/src/factories/usePaymentProviderFactory.ts` and returns `UsePaymentProvider` interface: -```typescript -interface UsePaymentProvider { - error: ComputedProperty; - loading: ComputedProperty; - state: ComputedProperty; - setState(state: any): void; - load(params: { customQuery?: CustomQuery }): Promise; - save(params: { paymentMethod: any, customQuery?: CustomQuery }): Promise; -} - -export interface UsePaymentProviderErrors { - load: Error; - save: Error; -} -``` -### `state` -Get all `PaymentProviders` as array. - -### `setState` -Set one or more `PaymentProviders` state. - -### `load` -Function that takes `customQuery` as param and gets the `state` array accordingly - -### `save` -Function that takes `paymentMethod` as param and saves it - -### `loading` -Returns the current state of `search` as `computed` boolean property - -### `error` -Reactive object containing the error message, if search failed for any reason. - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { usePaymentProvider } from '@vue-storefront/magento'; - -export default { - setup (props) { - const { load, state, save } = usePaymentProvider(); - - onMounted(async () => { - await load(); - }); - - const paymentMethods = computed(() => (Array.isArray(state.value) ? state.value.map((p) => ({ - label: p.title, - value: p.code, - })) : [])); - - const definePaymentMethods = async (paymentMethod) => { - try { - await save({ - paymentMethod: { - code: paymentMethod, - }, - }); - - emit('status', paymentMethod); - } catch (e) { - console.error(e); - } - }; - - return { - definePaymentMethods, - state, - } - } -} -``` diff --git a/docs/guide/composables/use-product.md b/docs/guide/composables/use-product.md deleted file mode 100644 index 3347cd1b6..000000000 --- a/docs/guide/composables/use-product.md +++ /dev/null @@ -1,309 +0,0 @@ -# useProduct - -## Features -`useProduct` composable is responsible for fetching a list of products. - -## API -```typescript -interface UseProduct { - products: ComputedProperty; - loading: ComputedProperty; - error: ComputedProperty; - search(params: ComposableFunctionArgs): Promise; -} - -export interface ProductsSearchParams { - perPage?: number; - page?: number; - sort?: any; - term?: any; - filters?: any; - [x: string]: any; -} - -export interface Products { - /** Layered navigation aggregations. */ - aggregations?: Maybe>>; - /** - * Layered navigation filters array. - * @deprecated Use aggregations instead - */ - filters?: Maybe>>; - /** An array of products that match the specified search criteria. */ - items?: Maybe>>; - /** An object that includes the page_info and currentPage values specified in the query. */ - page_info?: Maybe; - /** An object that includes the default sort field and all available sort fields. */ - sort_fields?: Maybe; - /** The number of products that are marked as visible. By default, in complex products, parent products are visible, but their child products are not. */ - total_count?: Maybe; -} - -export interface ProductInterface { - activity?: Maybe; - /** - * The attribute set assigned to the product. - * @deprecated The field should not be used on the storefront. - */ - attribute_set_id?: Maybe; - /** Relative canonical URL. This value is returned only if the system setting 'Use Canonical Link Meta Tag For Products' is enabled */ - canonical_url?: Maybe; - /** The categories assigned to a product. */ - categories?: Maybe>>; - category_gear?: Maybe; - climate?: Maybe; - collar?: Maybe; - color?: Maybe; - /** The product's country of origin. */ - country_of_manufacture?: Maybe; - /** - * Timestamp indicating when the product was created. - * @deprecated The field should not be used on the storefront. - */ - created_at?: Maybe; - /** Crosssell Products */ - crosssell_products?: Maybe>>; - /** Detailed information about the product. The value can include simple HTML tags. */ - description?: Maybe; - eco_collection?: Maybe; - erin_recommends?: Maybe; - features_bags?: Maybe; - format?: Maybe; - gender?: Maybe; - /** Indicates whether a gift message is available. */ - gift_message_available?: Maybe; - /** - * The ID number assigned to the product. - * @deprecated Use the `uid` field instead. - */ - id?: Maybe; - /** The relative path to the main image on the product page. */ - image?: Maybe; - /** A number representing the product's manufacturer. */ - manufacturer?: Maybe; - material?: Maybe; - /** An array of Media Gallery objects. */ - media_gallery?: Maybe>>; - /** - * An array of MediaGalleryEntry objects. - * @deprecated Use product's `media_gallery` instead - */ - media_gallery_entries?: Maybe>>; - /** A brief overview of the product for search results listings, maximum 255 characters. */ - meta_description?: Maybe; - /** A comma-separated list of keywords that are visible only to search engines. */ - meta_keyword?: Maybe; - /** A string that is displayed in the title bar and tab of the browser and in search results lists. */ - meta_title?: Maybe; - /** The product name. Customers use this name to identify the product. */ - name?: Maybe; - new?: Maybe; - /** - * The beginning date for new product listings, and determines if the product is featured as a new product. - * @deprecated The field should not be used on the storefront. - */ - new_from_date?: Maybe; - /** - * The end date for new product listings. - * @deprecated The field should not be used on the storefront. - */ - new_to_date?: Maybe; - /** Product stock only x left count */ - only_x_left_in_stock?: Maybe; - /** If the product has multiple options, determines where they appear on the product page. */ - options_container?: Maybe; - pattern?: Maybe; - performance_fabric?: Maybe; - /** - * A ProductPrices object, indicating the price of an item. - * @deprecated Use price_range for product price information. - */ - price?: Maybe; - /** A PriceRange object, indicating the range of prices for the product */ - price_range: PriceRange; - /** An array of TierPrice objects. */ - price_tiers?: Maybe>>; - /** An array of ProductLinks objects. */ - product_links?: Maybe>>; - /** The average of all the ratings given to the product. */ - rating_summary: Scalars['Float']; - /** Related Products */ - related_products?: Maybe>>; - /** The total count of all the reviews given to the product. */ - review_count: Scalars['Int']; - /** The list of products reviews. */ - reviews: ProductReviews; - sale?: Maybe; - /** A short description of the product. Its use depends on the theme. */ - short_description?: Maybe; - size?: Maybe; - /** A number or code assigned to a product to identify the product, options, price, and manufacturer. */ - sku?: Maybe; - sleeve?: Maybe; - /** The relative path to the small image, which is used on catalog pages. */ - small_image?: Maybe; - /** - * The beginning date that a product has a special price. - * @deprecated The field should not be used on the storefront. - */ - special_from_date?: Maybe; - /** The discounted price of the product. */ - special_price?: Maybe; - /** The end date that a product has a special price. */ - special_to_date?: Maybe; - /** Stock status of the product */ - stock_status?: Maybe; - strap_bags?: Maybe; - style_bags?: Maybe; - style_bottom?: Maybe; - style_general?: Maybe; - /** The file name of a swatch image */ - swatch_image?: Maybe; - /** The relative path to the product's thumbnail image. */ - thumbnail?: Maybe; - /** - * The price when tier pricing is in effect and the items purchased threshold has been reached. - * @deprecated Use price_tiers for product tier price information. - */ - tier_price?: Maybe; - /** - * An array of ProductTierPrices objects. - * @deprecated Use price_tiers for product tier price information. - */ - tier_prices?: Maybe>>; - /** - * One of simple, virtual, bundle, downloadable, grouped, or configurable. - * @deprecated Use __typename instead. - */ - type_id?: Maybe; - /** The unique ID for a `ProductInterface` object. */ - uid: Scalars['ID']; - /** - * Timestamp indicating when the product was updated. - * @deprecated The field should not be used on the storefront. - */ - updated_at?: Maybe; - /** Upsell Products */ - upsell_products?: Maybe>>; - /** The part of the URL that identifies the product */ - url_key?: Maybe; - /** @deprecated Use product's `canonical_url` or url rewrites instead */ - url_path?: Maybe; - /** URL rewrites list */ - url_rewrites?: Maybe>>; - /** The part of the product URL that is appended after the url key */ - url_suffix?: Maybe; - /** - * An array of websites in which the product is available. - * @deprecated The field should not be used on the storefront. - */ - websites?: Maybe>>; -} - -export interface UseProductErrors { - search: Error; -} -``` - -### `search` -Function that takes in `ProductsSearchParams` as optional params and gets the `products` accordingly - -### `products` -Returns `products` as a `computed` property - -### `loading` -Returns the `loading` state of `search` - -### `error` -reactive object containing the error message, if search failed for any reason. - - -## Getters - -```typescript -interface ProductGetters { - getAttributes: ( - products: Product, - _filterByAttributeName?: string[], - ) => Record, - getAverageRating: () => number, - getBreadcrumbs: ( - product: Product, - category?: Category, - ) => AgnosticBreadcrumb[], - getCategory: ( - product: Product, - currentUrlPath: string, - ) => Category | null, - getCategoryIds: (product: Product) => string[], - getCoverImage: (product: Product) => string, - getDescription: (product: Product) => string, - getFiltered: ( - products: Product[], - _filters: ProductsSearchParams, - ) => Product[], - getFormattedPrice: (price: number) => string | null, - getGallery: (product: Product) => AgnosticMediaGalleryItem[], - getId: (product: Product) => string, - getName: (product: Product) => string, - getPrice: (product: Product) => AgnosticPrice, - getProductRelatedProduct: (product: Product) => Product[] | [], - getProductUpsellProduct: (product: Product) => Product[] | [], - getProductSku: (product: Product) => string, - getProductThumbnailImage: (product: Product) => string, - getShortDescription: (product: Product) => string, - getSlug: (product: Product, category?: Category) => string, - getTotalReviews: () => number, - getTypeId: (product: Product) => string, -} -``` -* `getAttributes` - returns product attributes. -* `getAverageRating` - returns average rating from all reviews. -* `getBreadcrumbs` - returns 'Breadcrumbs'. -* `getCategoryIds` - returns all product categories. -* `getCategory` - returns 'Category'. -* `getCoverImage` - returns cover image of product. -* `getDescription` - returns product description. -* `getFiltered` - returns filtered product. -* `getFormattedPrice` - returns product price with currency sign. -* `getGallery` - returns product gallery. -* `getId` - returns product ID. -* `getName` - returns product name. -* `getPrice` - returns product price. -* `getProductRelatedProduct` - returns 'ProductRelatedProduct'. -* `getProductSku` - returns 'ProductSku'. -* `getProductThumbnailImage` - returns 'ProductThumbnailImage'. -* `getProductUpsellProduct` - returns 'ProductUpsellProduct'. -* `getShortDescription` - returns 'ShortDescription'. -* `getSlug` - returns product slug. -* `getTotalReviews` - returns total number of reviews product has. -* `getTypeId` - returns 'TypeId'. - -## Example - -```javascript -import { useProduct, productGetters } from '@vue-storefront/magento'; -import { onSSR } from '@vue-storefront/core' - -export default { - setup () { - const { products, search, loading, error } = useProduct(''); - - onSSR(async () => { - await search({ - pageSize: 10, - currentPage: 1, - sort: { - position: 'ASC', - }, - }) - }) - - return { - loading, - error, - product: computed(() => productGetters.getFiltered(products.value?.items, { master: true })[0]), - } - } -} -``` diff --git a/docs/guide/composables/use-related-products.md b/docs/guide/composables/use-related-products.md deleted file mode 100644 index be90af824..000000000 --- a/docs/guide/composables/use-related-products.md +++ /dev/null @@ -1,26 +0,0 @@ -# useRelatedProducts - -`useRelatedProducts` - -## API -```typescript -export interface UseRelatedProducts< - PRODUCTS, - RELATED_PRODUCT_SEARCH_PARAMS, - API extends PlatformApi = any> - extends Composable { - products: ComputedProperty; - loading: ComputedProperty; - error: ComputedProperty; - search(params: ComposableFunctionArgs): Promise; - [x: string]: any; -} - -``` - -* `` - - -## Example - -```javascript -``` diff --git a/docs/guide/composables/use-review.md b/docs/guide/composables/use-review.md deleted file mode 100644 index 8bc23b055..000000000 --- a/docs/guide/composables/use-review.md +++ /dev/null @@ -1,14 +0,0 @@ -# useReview - -`useReview` - -## API -```typescript -``` - -* `` - - -## Example - -```javascript -``` diff --git a/docs/guide/composables/use-shipping-provider.md b/docs/guide/composables/use-shipping-provider.md deleted file mode 100644 index 99e96b860..000000000 --- a/docs/guide/composables/use-shipping-provider.md +++ /dev/null @@ -1,45 +0,0 @@ -# useShippingProvider -`useShippingProvider` composable can be used for: -* Loading shipping methods for the current cart. -* Selecting shipping method for the current cart. - -> WIP - -## API -```typescript -interface UseShippingProvider { - error: ComputedProperty; - loading: ComputedProperty; - state: ComputedProperty; - setState(state: STATE): void; - load(): Promise; - load(params: { customQuery?: CustomQuery }): Promise; - save(params: { shippingMethod: SHIPPING_METHOD, customQuery?: CustomQuery }): Promise; -} -``` -* `load` - function for fetching shipping method. When invoked, it requests data from the API and populates the response key inside the state property. This method accepts a single optional params object. -* `save` - function for selecting shipping method. This method accepts a single saveParams object. -* `state` - function for selecting shipping method. This method accepts a single saveParams object. -* `loading` - a reactive object containing information about loading state of your load or save method. -* `error` - a reactive object containing the error message, if load or save failed for any reason. - -## Example -````javascript -import { useShippingProvider } from '@vue-storefront/magento'; -import { onSSR } from '@vue-storefront/core'; -import { computed } from '@vue/composition-api'; - -export default { - setup () { - const { load, state } = useShippingProvider(); - - onSSR(async () => { - await load(); - }); - - return { - selectedShippingMethod: computed(() => state.value && state.value.response) - }; - } -} -```` diff --git a/docs/guide/composables/use-shipping.md b/docs/guide/composables/use-shipping.md deleted file mode 100644 index d30a7662d..000000000 --- a/docs/guide/composables/use-shipping.md +++ /dev/null @@ -1,43 +0,0 @@ -# useShipping -`useShipping` composable can be used for: -* Loading shipping address for the current cart. -* Saving shipping address for the current cart. - -> WIP - -## API -```typescript -interface UseShipping { - error: ComputedProperty; - loading: ComputedProperty; - shipping: ComputedProperty; - load(): Promise; - load(params: { customQuery?: CustomQuery }): Promise; - save: (params: { params: SHIPPING_PARAMS; shippingDetails: SHIPPING; customQuery?: CustomQuery }) => Promise; -} -``` -* `load` - function for fetching shipping address. When invoked, it requests data from the API and populates shipping property. This method accepts a single optional params object. -* `save` - function for saving shipping address. This method accepts a single saveParams object. -* `shipping` - a main data object that contains a shipping address. -* `loading` - a reactive object containing information about loading state of your load or save method. -* `error` - a reactive object containing the error message, if load or save failed for any reason. - -## Example -````javascript -import { useShipping } from '@vue-storefront/magento'; -import { onSSR } from '@vue-storefront/core'; - -export default { - setup () { - const { load, shipping } = useShipping(); - - onSSR(async () => { - await load(); - }); - - return { - shipping - }; - } -} -```` diff --git a/docs/guide/composables/use-store.md b/docs/guide/composables/use-store.md deleted file mode 100644 index 9775c0d8f..000000000 --- a/docs/guide/composables/use-store.md +++ /dev/null @@ -1,52 +0,0 @@ -# `useStore` - -## Features - -`useStore` composable is responsible, for interactions with the available stores in Magento. It allows to: -* fetch available stores -* switch to another store - -## API -The `useStore` composable implements custom factory `useStoreFactory` located in `packages/composables/src/factories/useStoreFactory.ts` and returns `UseStore` interface: -```typescript -interface UseStore extends Composable { - load: () => Promise; - change: (params: ComposableFunctionArgs) => void; - stores: ComputedRef; - loading: ComputedRef; -} - -export interface AvailableStores = { - availableStores? : Maybe>> -}; -``` - -## Getters - -`storeGetter` object contains following methods: - -* `getItems` - returns list of available stores. -* `getSelected` - returns if the selected store is equal to the config store. - - -## Example - -```js -import { useStore, storeGetters } from '@vue-storefront/magento'; -import { onSSR } from '@vue-storefront/core'; - -export default { - setup () { - const { load: loadStores, stores } = useStore(); - - onSSR(async () => { - await loadStores(); - }); - - return { - stores: storesGetters.getItems(stores.value), - selectedStore: storesGetters.getSelected(stores.value) - }; - } -} -``` diff --git a/docs/guide/composables/use-upsell-products.md b/docs/guide/composables/use-upsell-products.md deleted file mode 100644 index bdc914dff..000000000 --- a/docs/guide/composables/use-upsell-products.md +++ /dev/null @@ -1,24 +0,0 @@ -# useUpsellProducts - -`useUpsellProducts` - -## API -```typescript -export interface UseUpsellProducts< - PRODUCTS, UPSELL_PRODUCTS_SEARCH_PARAMS, - API extends PlatformApi = any> - extends Composable { - products: ComputedProperty; - loading: ComputedProperty; - error: ComputedProperty; - search(params: ComposableFunctionArgs): Promise; - [x: string]: any; -} -``` - -* `` - - -## Example - -```javascript -``` diff --git a/docs/guide/composables/use-url-resolver.md b/docs/guide/composables/use-url-resolver.md deleted file mode 100644 index 038f9863c..000000000 --- a/docs/guide/composables/use-url-resolver.md +++ /dev/null @@ -1,58 +0,0 @@ -# useRouter - -`useRouter` composition API function is responsible, as its name suggests, for interactions with the routes in your eCommerce. This function returns following values: - -## API -```typescript -interface UseRouter { - search: (url: string) => Promise; - route: Readonly>>; - loading: Readonly>>; -} -``` - -* `search` - Function that takes in a `url` and fills the `route` property -* `route` - Returns the current Page -* `loading` - Returns state of `search` - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useRouter } from '@vue-storefront/magento'; -import { computed } from '@vue/composition-api'; - -export default { - setup(props, context) { - const { - path - } = context.root.$route; - const { - loading, - search, - route - } = useRouter('router:' + path); - onSSR(async () => { - await search(path); - if (route.value.data.urlResolver === null) { - context.root.$nuxt.error({ - statusCode: 404, - message: 'Page not found' - }); - } - }); - - const routeType = computed(() => { - if (loading.value || route.value.data.urlResolver === null) { - return {}; - } - return route.value.data.urlResolver; - }); - - return { - loading, - routeType - }; - } -}; -``` diff --git a/docs/guide/composables/use-user-billing.md b/docs/guide/composables/use-user-billing.md deleted file mode 100644 index 6570b9c33..000000000 --- a/docs/guide/composables/use-user-billing.md +++ /dev/null @@ -1,106 +0,0 @@ -# useUserBilling -`useUserBilling` composable can be used to: -* fetch existing billing addresses, -* submit new billing addresses, -* modify and delete existing billing addresses. - -````typescript -interface UseUserBilling { - billing: ComputedProperty; - addAddress: (params: { - address: USER_BILLING_ITEM; - }) => Promise; - deleteAddress: (params: { - address: USER_BILLING_ITEM; - }) => Promise; - updateAddress: (params: { - address: USER_BILLING_ITEM; - }) => Promise; - load: () => Promise; - setDefaultAddress: (params: { - address: USER_BILLING_ITEM; - }) => Promise; - loading: ComputedProperty; - error: ComputedProperty; -} -```` - -* `load` - function for fetching user addresses. When invoked, it requests data from the API and populates billing property. -* `addAddress`- function for posting new billing address. This method accepts a single params object. -* `deleteAddress` - function for deleting existing billing address. This method accepts a single params object. -* `updateAddress` - function for updating existing billing address. This method accepts a single params object. -* `setDefaultAddress` - function for settings an existing billing address as default. This method accepts a single params object. -* `billing` - reactive data object containing response from the backend. -* `loading` - reactive object containing information about loading state of load, addAddress, deleteAddress, updateAddress and setDefaultAddress methods. -* `error` - reactive object containing the error message, if some properties failed for any reason. - -## Getter -````typescript -interface UserBillingGetters { - getAddresses: (billing: USER_BILLING, criteria?: Record) => USER_BILLING_ITEM[]; - getDefault: (billing: USER_BILLING) => USER_BILLING_ITEM; - getTotal: (billing: USER_BILLING) => number; - getPostCode: (address: USER_BILLING_ITEM) => string; - getStreetName: (address: USER_BILLING_ITEM) => string; - getStreetNumber: (address: USER_BILLING_ITEM) => string | number; - getCity: (address: USER_BILLING_ITEM) => string; - getFirstName: (address: USER_BILLING_ITEM) => string; - getLastName: (address: USER_BILLING_ITEM) => string; - getCountry: (address: USER_BILLING_ITEM) => string; - getPhone: (address: USER_BILLING_ITEM) => string; - getEmail: (address: USER_BILLING_ITEM) => string; - getProvince: (address: USER_BILLING_ITEM) => string; - getCompanyName: (address: USER_BILLING_ITEM) => string; - getTaxNumber: (address: USER_BILLING_ITEM) => string; - getId: (address: USER_BILLING_ITEM) => string; - getApartmentNumber: (address: USER_BILLING_ITEM) => string | number; - isDefault: (address: USER_BILLING_ITEM) => boolean; -} -```` - -* `getAddresses` - returns list of billing addresses. -* `getDefault` - returns a default billing address. -* `getTotal` - returns total number of billing addresses user has. -* `getId` - returns id from an individual address. -* `getPostCode` - returns post code from an individual address. -* `getStreetName` - returns street name from an individual address. -* `getStreetNumber` - returns street number from an individual address. -* `getCity` - returns city name from an individual address. -* `getFirstName` - returns first name from an individual address. -* `getLastName` - returns last name from an individual address. -* `getCountry` - returns country name from an individual address. -* `getPhone` - return phone number from an individual address. -* `getEmail` - returns e-mail address from an individual address. -* `getProvince` - returns province (state) from an individual address. -* `getCompanyName` - returns company name from an individual address. -* `getTaxNumber` - returns tax number from an individual address. -* `getApartmentNumber` - returns apartment number from an individual address. -* `isDefault` - return information if address is current default. - -## Example -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useUserBilling, userBillingGetters } from '@vue-storefront/magento'; - -export default { - setup() { - const { - billing, - load, - addAddress, - deleteAddress, - updateAddress - } = useUserBilling(); - - // If you're using Nuxt or any other framework for Universal Vue apps - onSSR(async () => { - await load(); - }); - - return { - billing: computed(() => userBillingGetters.getAddresses(billing.value)), - userBillingGetters - }; - } -}; -``` diff --git a/docs/guide/composables/use-user-order.md b/docs/guide/composables/use-user-order.md deleted file mode 100644 index 68f2f149f..000000000 --- a/docs/guide/composables/use-user-order.md +++ /dev/null @@ -1,44 +0,0 @@ -# useUserOrder - -`useUserOrders` composable is responsible, as it's name suggests for interactions with user's order history from your eCommerce. - -## API - -```typescript -interface UseUserOrder { - orders: ComputedProperty; - search(params: ComposableFunctionArgs): Promise; - loading: ComputedProperty; - error: ComputedProperty; -} -``` - -* `orders` - a main data object that contains an array of orders fetched by searchOrders method. -* `totalOrder` - Returns the total `number` of `orders` for the current User -* `error` - reactive object containing the error message, if some properties failed for any reason. -* `loading` - a reactive object containing information about loading state of your searchOrders method. - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useUserOrder } from '@vue-storefront/magento'; -import { computed } from '@vue/composition-api'; - -export default { - setup() { - const { - orders, - searchOrders - } = useUserOrders(); - - onSSR(async () => { - await searchOrder(); - }); - - return { - orders: computed(() => orders ? orders.value : []) - } - } -} -``` diff --git a/docs/guide/composables/use-user-shipping.md b/docs/guide/composables/use-user-shipping.md deleted file mode 100644 index 8820f9cbb..000000000 --- a/docs/guide/composables/use-user-shipping.md +++ /dev/null @@ -1,56 +0,0 @@ -# useUserShipping - -`useShipping` composable can be used for: -* Loading shipping address for the current cart. -* Saving shipping address for the current cart. - -## API -````typescript -interface UseUserShipping { - shipping: ComputedProperty; - addAddress: (params: { - address: USER_SHIPPING_ITEM; - }) => Promise; - deleteAddress: (params: { - address: USER_SHIPPING_ITEM; - }) => Promise; - updateAddress: (params: { - address: USER_SHIPPING_ITEM; - }) => Promise; - load: () => Promise; - setDefaultAddress: (params: { - address: USER_SHIPPING_ITEM; - }) => Promise; - loading: ComputedProperty; - error: ComputedProperty; -} -```` - -* `load` - function for fetching shipping address. When invoked, it requests data from the API and populates shipping property. This method accepts a single optional params object. -* `save` - function for saving shipping address. This method accepts a single saveParams object. -* `shipping` - a main data object that contains a shipping address. -* `addAddress` - function for adding a shipping address. This method accepts addressParams object -* `deleteAddress` - function for deleting a shipping address. This method accepts addressParams object -* `updateAddress` - function for updating a shipping address. This method accepts addressParams object -* `loading` - a reactive object containing information about loading state of your load or save method. -* `error` - a reactive object containing the error message, if load or save failed for any reason. - -## Example -```javascript -import { useShipping } from '@vue-storefront/magento'; -import { onSSR } from '@vue-storefront/core'; - -export default { - setup () { - const { load, shipping } = useShipping(); - - onSSR(async () => { - await load(); - }); - - return { - shipping - }; - } -} -``` diff --git a/docs/guide/composables/use-user.md b/docs/guide/composables/use-user.md deleted file mode 100644 index 31cfce636..000000000 --- a/docs/guide/composables/use-user.md +++ /dev/null @@ -1,82 +0,0 @@ -# useUser - -`useUser` composable can be used to: -* manage user authentication -* manage authentication data like email address, login or password. -* If you want to fetch/save other user data you should use the following composables: - -* `useUserBilling` -* `useUserShipping` -* `useUserOrders` - -## API -```typescript -interface UseUser { - user: ComputedProperty; - setUser: (user: USER) => void; - updateUser: (params: { - user: UPDATE_USER_PARAMS; - }) => Promise; - register: (params: { - user: UseUserRegisterParams; - }) => Promise; - login: (params: { - user: UseUserLoginParams; - }) => Promise; - logout: () => Promise; - changePassword: (params: { - current: string; - new: string; - }) => Promise; - load: () => Promise; - isAuthenticated: Ref; - loading: ComputedProperty; - error: ComputedProperty; -} -``` - -* `user` - reactive object containing information about current user. -* `updateUser` - function for updating user data. When invoked, it submits data to the API and populates user property with updated information. This method accepts a single params object. -* `register` - function for creating a new user. When invoked, it submits new user data to the API and saves them. This method accepts a single params object. -* `login` - function for log in a user based on a username and password. This method accepts a single params object. -* `logout` - function for logout a user. -* `changePassword` - function for changing user password. This method accepts a single params object. -* `isAuthenticated` - checks if user is authenticated or not. -* `loading` - reactive object containing information about loading state of user. -* `error` - reactive object containing the error message, if some properties failed for any reason. - -## Getters -````typescript -interface UserGetters { - getFirstName: (customer: USER) => string; - getLastName: (customer: USER) => string; - getFullName: (customer: USER) => string; - getEmailAddress: (customer: USER) => string; - [getterName: string]: (element: any, options?: any) => unknown; -} -```` -* `getFirstName` - returns user first name. -* `getLastName` - returns user last name. -* `getFullName` - returns full user name. -* `getEmailAddress` - returns user email address. - -## Example -```javascript -import { - useUser -} from '@vue-storefront/magento'; - -export default { - setup () { - const { user, register, login, loading } = useUser(); - - return { - register, - login, - loading, - firstName: userGetters.getFirstName(user.value), - email: userGetters.getEmailAddress(user.value) - } - } -} -``` diff --git a/docs/guide/composables/use-wishlist.md b/docs/guide/composables/use-wishlist.md deleted file mode 100644 index 0fd5c3d9f..000000000 --- a/docs/guide/composables/use-wishlist.md +++ /dev/null @@ -1,94 +0,0 @@ -# useWishlist - -`useWishlist` composable is responsible, for integrating with wishlist from Magento. It allows to: -* fetch products from wishlist -* add products to wishlist -* remove products from wishlist -* check if product is on wishlist - -## API -```typescript - interface UseWishlist { - wishlist: ComputedProperty; - loading: ComputedProperty; - addItem(params: { - product: PRODUCT; - customQuery?: CustomQuery; - }): Promise; - removeItem(params: { - product: WISHLIST_ITEM; - customQuery?: CustomQuery; - }): Promise; - load(): Promise; - load(params: { - customQuery?: CustomQuery; - }): Promise; - clear(): Promise; - setWishlist: (wishlist: WISHLIST) => void; - isOnWishlist({ product: PRODUCT }: { - product: any; - }): boolean; - error: ComputedProperty; -} -``` - -* `wishlist` - a main data object. -* `load` - function used to retrieve wishlist products. When invoked, it requests data from the API and populates wishlist property. This method accepts a single params object. -* `addItem` - function used to add new product to wishlist. When invoked, it submits data to the API and populates wishlist property with updated information. This method accepts a single params object. -* `removeItem` - function that removes products from the wishlist. It submits data to the API and populates updated wishlist property. This method accepts a single params object. -* `clear` - function that removes all products from the wishlist and populates clear wishlist property. -* `isOnWishlist` - function that checks if product is on the wishlist. It returns boolean value. This method accepts a single params object. -* `loading` - function that checks if product is on the wishlist. It returns boolean value. This method accepts a single params object. -* `error` - reactive object containing the error message, if some properties failed for any reason. - -## Getters -> WIP - -````typescript -interface WishlistGetters { - getItems: (wishlist: WISHLIST) => WISHLIST_ITEM[]; - getItemName: (wishlistItem: WISHLIST_ITEM) => string; - getItemImage: (wishlistItem: WISHLIST_ITEM) => string; - getItemPrice: (wishlistItem: WISHLIST_ITEM) => AgnosticPrice; - getItemAttributes: (wishlistItem: WISHLIST_ITEM, filters?: Array) => Record; - getItemSku: (wishlistItem: WISHLIST_ITEM) => string; - getTotals: (wishlist: WISHLIST) => AgnosticTotals; - getTotalItems: (wishlist: WISHLIST) => number; - getFormattedPrice: (price: number) => string; - [getterName: string]: (element: any, options?: any) => unknown; -} -```` -* `getItems` - returns list of products on wishlist -* `getItemName` - returns product's name from wishlist. -* `getItemImage` - returns product's image from wishlist. -* `getItemPrice` - returns product's price from wishlist. -* `getItemQty` - returns quantity of product which is on wishlist. -* `getItemAttributes` - returns product variant attribute chosen by its name. -* `getItemSku` - returns product's SKU code. -* `getTotals` - returns price of products. -* `getTotalItems` - returns amount of all items that are currently on wishlist. -* `getFormattedPrice` - returns price in formatted manner taking into account local specifics. - -## Example - -```javascript -import { onSSR } from '@vue-storefront/core'; -import { useWishlist, wishlistGetters } from '@vue-storefront/magento'; -export default { - setup() { - const { load: loadWishlist } = useWishlist(); - - const wishlistItems = computed(() => wishlistGetters.getItems()); - - // If you're using Nuxt or any other framework for Universal Vue apps - onSSR(async () => { - await loadWishlist(); - }); - - return { - loadWishlist, - wishlistItems - }; - } -}; -``` diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index 9e747f457..74e016beb 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -11,5 +11,5 @@ vsf init && cd && yarn && yarn dev ## How to start if you want to contribute? -Want to contribute? Ping us on `magento2-vsf2` channel on [our Discord](https://discord.vuestorefront.io)! +Want to contribute? Ping us on `magento2` channel on [our Discord](https://discord.vuestorefront.io)! diff --git a/docs/migration-guides/1.0.0-rc.7/index.md b/docs/migration-guides/1.0.0-rc.7/index.md new file mode 100644 index 000000000..13ed518dd --- /dev/null +++ b/docs/migration-guides/1.0.0-rc.7/index.md @@ -0,0 +1,108 @@ +# Vue Storefront for Magento 1.0.0-rc.7 release notes + +Vue Storefront for Magento 1.0.0.rc.7 contains backward-incompatible changes. To review these backward-incompatible changes, see + +[1.0.0-rc.7 **Backward incompatible changes reference**](./rc.7-bic.md) + +## Vue Storefront for Magento 1.0.0-rc.7 highlights + +### Refactoring of composables + +In this version, the integration packages `@vue-storefront/magento` has been marked as deprecated. All things from this package, including composables, getters, and helpers have been moved to `@vue-storefront/magento-theme` + +**All composables have been refactored and moved to the theme.** + +- SharedRefs are not used anymore. + - from now we use the Pinia store for global state management + - instead of sharing context between each composables we use the useContext hook from Nuxt Composition API + - factories have been removed, and from now each composable is a function without dependencies on the `@vue-storefront/core` package + + +**Getters have been moved to the theme package and marked as deprecated.** + +In the next releases, getters will be removed. + +**Helpers have been moved to the theme package** + +### The onSSR hook is not used anymore + +From now, each operation that should be performed on the server-side must be called inside on the `useFetch` and the `useAsync` functions that are part of **Nuxt Composition API**. + +### The i18n plugin is not used anymore + +The i18n plugin from `@vue-storefront/core` is not used anymore. Configuring i18n is the responsibility of the theme package from now. + +### Modularization + +We started the process of split whole app into modules. The first module is the category module that contains components and logic responsible for catalog category pages. In next releases we will continue refactorization and add modules for other parts of app like product, checkout, account, wishlist and so on. + +### New features + +- Breadcrumbs on Category pages [#819](https://github.com/vuestorefront/magento2/pull/819) +- Loading skeletons: [#681](https://github.com/vuestorefront/magento2/pull/681) +- Styles for default Magento Static Blocks that appear on Category Landing Pages: [#685](https://github.com/vuestorefront/magento2/pull/685) +- Added possibility to navigate to nested categories in the mobile side menu [#709](https://github.com/vuestorefront/magento2/pull/709) +- Added information about selected filters in the filters sidebar [#830](https://github.com/vuestorefront/magento2/pull/830) +- Display category title below breadcrumbs [#892](https://github.com/vuestorefront/magento2/pull/892) +- Added mega menu on desktop view [#903](https://github.com/vuestorefront/magento2/pull/903) + +### Performance improvements + +- From now, user data is loaded only on pages where it’s necessary like checkout and my account pages. In other cases, user data is not loading and thanks to that the performance on mobile is better because we decreased the time of JS long tasks. https://github.com/vuestorefront/magento2/pull/859 +- We added the storeConfig plugin and changed the approach to getting config from Magento. [#862](https://github.com/vuestorefront/magento2/pull/862) + - before we loaded the whole Magento config on page load, and we did that in layout so it was not possible to change the use different layout than the default + - after this change, we load only a few necessary fields by the Nuxt plugin. + - Thanks to that it’s possible to use other layouts like default. Moreover, this has an impact on performance because the storeConfig Magento query is not cached on the Magento side, so when we decreased the amount of data, the time of response should be faster. +- Once we updated the Storefront UI to the newest version, we were able to add support for the NuxtImage for images in the Gallery on ta Product Page [#850](https://github.com/vuestorefront/magento2/pull/850) + +### **Bugfix** + +- color swatches are visible on the product page on a mobile device so from now it’s possible to add a configurable product to the cart on mobile devices. [#926](https://github.com/vuestorefront/magento2/pull/926) +- Wishlist and cart transition works correctly from now when a user opens the wishlist sidebar or cart sidebar [#918](https://github.com/vuestorefront/magento2/pull/918) +- Once the message about the not authorized user is displayed, the cookie with a message will be removed to avoid displaying the message endlessly. [#775](https://github.com/vuestorefront/magento2/pull/775) +- From now, it’s possible to add more than one product to the cart from the Category page in list mode [#680](https://github.com/vuestorefront/magento2/pull/680) +- The “your bag is empty” phrase is centered correctly from now [#679](https://github.com/vuestorefront/magento2/pull/679) +- updated the useUser composable to assign error values for an email update action [#777](https://github.com/vuestorefront/magento2/pull/777) +- removed redundant form handling requests to avoid duplicated/multiplicated requests [#777](https://github.com/vuestorefront/magento2/pull/777) +- fixed 404-page issues and my-account redirects for non-logged users [#722](https://github.com/vuestorefront/magento2/pull/722) +- fixed price caching issue on category page [#793](https://github.com/vuestorefront/magento2/pull/793) +- fallow one digit house numbers [#824](https://github.com/vuestorefront/magento2/pull/824) +- The billing address is no longer cleared while returning to the billing step on checkout [#783](https://github.com/vuestorefront/magento2/pull/783) +- removed placeholder for a sorting mechanism in the category navbar [#782](https://github.com/vuestorefront/magento2/pull/782) +- fixed wrong direction of the draggable icon on the product page (mobile) [#927](https://github.com/vuestorefront/magento2/pull/927) +- Click on a product tab click to scroll to tab content from now [#931](https://github.com/vuestorefront/magento2/pull/931) +- Prevented content jump when an option or variant is selected [#933](https://github.com/vuestorefront/magento2/pull/933) + +### Refactors + +- Removed categoryGetters call from AppHeader.vue [#853](https://github.com/vuestorefront/magento2/pull/853) +- Removed storeConfigGetters and storeGetters from StoreSwitcher and StoresModal +- Removed categoryGetters from SearchBar.vue +- Removed category results from the Search results components [#867](https://github.com/vuestorefront/magento2/pull/867) +- Created the category module and refactored the category three components +- refactored Category page’s filters on desktop view [#815](https://github.com/vuestorefront/magento2/pull/815) +- refactored store switcher [#794](https://github.com/vuestorefront/magento2/pull/794) +- refactored cookie retrieval [#797](https://github.com/vuestorefront/magento2/pull/797) +- removed links from order's product [#778](https://github.com/vuestorefront/magento2/pull/778) +- Moved filters to sidebar on desktop view [#884](https://github.com/vuestorefront/magento2/pull/884) +- Created Grid/list components on Category page [#910](https://github.com/vuestorefront/magento2/pull/910) +- Refactored project config & env variables [#813](https://github.com/vuestorefront/magento2/pull/813) +- refactored useUiState [#595](https://github.com/vuestorefront/magento2/pull/595) +- changed homepage slider to the hero section [#928](https://github.com/vuestorefront/magento2/pull/928) +- changed products carousel on the home page to non-carousel section [#914](https://github.com/vuestorefront/magento2/pull/914) +- added skeleton loaders in category nabvar [#936](https://github.com/vuestorefront/magento2/pull/936) + +### Chore + +- Updated StorefrontUI to 0.13.0 [#781](https://github.com/vuestorefront/magento2/pull/781) +- Updated @vue-storefront packages to 2.5.6 [#740](https://github.com/vuestorefront/magento2/pull/740) +- fixed .lintstagedrc {.vue} warning [#779](https://github.com/vuestorefront/magento2/pull/779) +- lint-staged should run only once [#789](https://github.com/vuestorefront/magento2/pull/789) +- auto-assign team members to pull requests [#759](https://github.com/vuestorefront/magento2/pull/759) +- removed commitizen prepare-commit-msg git hook [#780](https://github.com/vuestorefront/magento2/pull/780) +- Merged the three .lintstagedrc regexes into one [#787](https://github.com/vuestorefront/magento2/pull/787) + +### Documentation + +- documentation about composables has been fully rewrote +- added documentation for API Client methods diff --git a/docs/migration-guides/1.0.0-rc.7/rc.7-bic.md b/docs/migration-guides/1.0.0-rc.7/rc.7-bic.md new file mode 100644 index 000000000..19c34a5f9 --- /dev/null +++ b/docs/migration-guides/1.0.0-rc.7/rc.7-bic.md @@ -0,0 +1,88 @@ +# 1.0.0-rc.7 Backward incompatible changes reference + +In this document you can see crucial breaking changes in the `1.0.0-rc.7` comparing to `1.0.0-rc.6` release. To see all changes, please take a look at [the release PR](https://github.com/vuestorefront/magento2/pull/949/files). + +## Composables (@vue-storefront/magento package) + +| File | what and how it changed | +|---------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| packages/composables/nuxt/plugin.js | Has been moved to packages/theme/modules/magento/plugin.ts | +| packages/composables/package.json | build scripts have been changed | +| packages/composables/src/composables/useAddresses/index.ts | - Marked as deprecated - use packages/theme/modules/customer/composables/useAddresses/index.ts instead, return values of the useAddresses composable have been changed | +| packages/composables/src/composables/useBilling/index.ts | - Marked as deprecated - use packages/theme/composables/useBilling/index.ts instead, return values of the useBilling composable have been changed | +| packages/composables/src/composables/useCart/index.ts | - Marked as deprecated - use packages/theme/composables/useCart/index.ts instead, return values of the useCart composable have been changed | +| packages/composables/src/composables/useCategory/index.ts | - Marked as deprecated - use packages/theme/modules/catalog/category/composables/useCategory/index.ts instead,return values of the useCategory composable have been changed | +| packages/composables/src/composables/useCategorySearch/index.ts | - Marked as deprecated - use packages/theme/modules/catalog/category/composables/useCatgegorySearch/index.ts instead | +| packages/composables/src/composables/useConfig/index.ts | - Marked as deprecated - use packages/theme/composables/useConfig/index.ts instead | +| packages/composables/src/composables/useContent/index.ts | - Marked as deprecated - use packages/theme/composables/useContent/index.ts instead, return values of the useContent composable have been changed | +| packages/composables/src/composables/useCountrySearch/index.ts | - Marked as deprecated - use packages/theme/composables/useCountry/index.ts instead, return values of the useCountrySearch composable have been changed | +| packages/composables/src/composables/useCurrency/index.ts | - Marked as deprecated - use packages/theme/composables/useCurrency/index.ts instead, return values of the useCurrency composable have been changed | +| packages/composables/src/composables/useCustomMutation/index.ts | - Marked as deprecated - use the useApi composable to send custom mutations | +| packages/composables/src/composables/useCustomQuery/index.ts | - Marked as deprecated - use the useApi composable to send custom mutations | +| packages/composables/src/composables/useExternalCheckout/index.ts | - Marked as deprecated - use packages/theme/composables/useExternalCheckout/index.ts instead | +| packages/composables/src/composables/useFacet/index.ts | - Marked as deprecated - use packages/theme/composables/useFacet/index.ts instead | +| packages/composables/src/composables/useForgotPassword/index.ts | - Marked as deprecated - use packages/theme/modules/customer/composables/useForgotPassword/index.ts instead | +| packages/composables/src/composables/useGetShippingMethods/index.ts | - Marked as deprecated - use packages/theme/composables/useGetShippingMethods/index.ts instead, return values of the useGetShippingMethods composable have been changed | +| packages/composables/src/composables/useGuestUser/index.ts | - Marked as deprecated - use packages/theme/modules/customer/composables/useGuestUser/index.ts instead, return values of the useGuestUser composable have been changed | +| packages/composables/src/composables/useMakeOrder/index.ts | - Marked as deprecated - use packages/theme/composables/useMakeOrder/index.ts instead, return values of the useMakeOrder composable have been changed | +| packages/composables/src/composables/useNewsletter/index.ts | - Marked as deprecated - use packages/theme/composables/useNewsletter/index.ts instead | +| packages/composables/src/composables/usePaymentProvider/index.ts | - Marked as deprecated - use packages/theme/composables/usePaymentProvider/index.ts instead, return values of the usePaymentProvider composable have been changed | +| packages/composables/src/composables/useProduct/index.ts | - Marked as deprecated - use packages/theme/modules/catalog/product/composables/useProduct/index.ts instead, return values of the useProduct composable have been changed | +| packages/composables/src/composables/useRelatedProducts/index.ts | - Marked as deprecated - use packages/theme/modules/catalog/product/composables/useRelatedProducts/index.ts instead, return values of the useRelatedProducts composable have been changed | +| packages/composables/src/composables/useReview/index.ts | - Marked as deprecated - use packages/theme/composables/useReview/index.ts instead, return values of the useReview composable have been changed | +| packages/composables/src/composables/useShipping/index.ts | - Marked as deprecated - use packages/theme/composables/useShipping/index.ts instead, return values of the useShipping composable have been changed | +| packages/composables/src/composables/useShippingProvider/index.ts | - Marked as deprecated - use packages/theme/composables/useShippingProvider/index.ts instead, return values of the useShippingProvider composable have been changed | +| packages/composables/src/composables/useStore/index.ts | - Marked as deprecated - use packages/theme/composables/useStore/index.ts instead, return values of the useStore composable have been changed | +| packages/composables/src/composables/useUpsellProducts/index.ts | - Marked as deprecated - use packages/theme/modules/catalog/product/composables/useUpsellProducts/index.ts instead, return values of the useUpsellProducts composable have been changed | +| packages/composables/src/composables/useUrlResolver/index.ts | - Marked as deprecated - use packages/theme/composables/useUrlResolver/index.ts instead, return values of the useUrlResolver composable have been changed | +| packages/composables/src/composables/useUser/index.ts | - Marked as deprecated - use packages/theme/modules/customer/composables/useUser/index.ts instead, return values of the useUser composable have been changed | +| packages/composables/src/composables/useUserBilling/index.ts | - Marked as deprecated | +| packages/composables/src/composables/useUserShipping/index.ts | - Marked as deprecated | +| packages/composables/src/composables/useUserOrder/index.ts | - Marked as deprecated - use packages/theme/modules/customer/composables/useUserOrder/index.ts instead, return values of the useUserOrder composable have been changed | +| packages/composables/src/composables/useWishlist/index.ts | - Marked as deprecated - use packages/theme/modules/wishlist/composables/useWishlist/index.ts instead, return values of the useWishlist composable have been changed | +| packages/composables/src/getters/_utils.ts | - marked as deprecated. Use packages/theme/getters/_utils.ts instead | +| packages/composables/src/getters/addressGetter.ts | - marked as deprecated. Use packages/theme/modules/customer/getters/addressGetter.ts instead | +| packages/composables/src/getters/cartGetters.ts | - marked as deprecated. Use packages/theme/getters/cartGetters.ts instead | +| packages/composables/src/getters/categoryGetters.ts | - marked as deprecated | +| packages/composables/src/getters/checkoutGetters.ts | - marked as deprecated. Use packages/theme/getters/checkoutGetters.ts instead | +| packages/composables/src/getters/facetGetters.ts | - marked as deprecated. Use packages/theme/getters/packages/theme/getters/facetGetters.ts instead | +| packages/composables/src/getters/forgotPasswordGetters.ts | - marked as deprecated. | +| packages/composables/src/getters/orderGetters.ts | - marked as deprecated. Use packages/theme/getters/packages/theme/getters/orderGetters.ts instead | +| packages/composables/src/getters/productGetters.ts | - marked as deprecated. Use packages/theme/modules/catalog/product/getters/productGetters.ts instead | +| packages/composables/src/getters/reviewGetters.ts | - marked as deprecated. Use packages/theme/getters/packages/theme/getters/reviewGetters.ts instead | +| packages/composables/src/getters/storeConfigGetters.ts | - marked as deprecated. Use packages/theme/getters/packages/theme/getters/storeConfigGetters.ts instead | +| packages/composables/src/getters/storeGetters.ts | - marked as deprecated. Use packages/theme/getters/packages/theme/getters/storeGetters.ts instead | +| packages/composables/src/getters/userAddressesGetters.ts | - marked as deprecated. Use packages/theme/modules/customer/getters/userAddressesGetters.ts instead | +| packages/composables/src/getters/userBillingGetters.ts | - marked as deprecated. Use packages/theme/modules/customer/getters/userBillingGetters.ts instead | +| packages/composables/src/getters/userGetters.ts | - marked as deprecated. Use packages/theme/modules/customer/getters/userGetters.ts instead | +| packages/composables/src/getters/userShippingGetters.ts | - marked as deprecated. Use packages/theme/modules/customer/getters/userShippingGetters.ts instead | +| packages/composables/src/getters/wishlistGetters.ts | - marked as deprecated. Use packages/theme/getters/packages/theme/getters/wishlistGetters.ts instead | +| packages/composables/src/helpers/buildCategoryTree.ts | - marked as deprecated | +| packages/composables/src/helpers/compareWishlist.ts | - marked as deprecated | +| packages/composables/src/helpers/findItemOnWishlist.ts | - marked as deprecated. Use packages/theme/modules/wishlist/helpers/findItemOnWishlist.ts instead | +| packages/composables/src/helpers/htmlDecoder.ts | - marked as deprecated. Use packages/theme/modules/wishlist/helpers/htmlDecoder.ts instead | +| packages/composables/src/helpers/userAddressManipulator.ts | - marked as deprecated. Use packages/theme/modules/customer/helpers/userAddressManipulator.ts instead | +| packages/composables/src/helpers/userDataGenerator.ts | - marked as deprecated. Use packages/theme/modules/customer/helpers/generateUserData.ts instead | + +## Theme + +In this document, we described the most crucial changes. We recommend checking each component/template to see all changes. + +| File | what and how it changed | +|--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------| +| packages/theme/.env.example | Variables’ names have been changed | +| packages/theme/components/Category/CategorySidebarMenu.vue | The component has been removed | +| packages/theme/components/Header/SearchBar/SearchResults.vue | Search results for categories have been removed | +| packages/theme/components/MobileMenuSidebar.vue | The component has been removed | +| packages/theme/components/Products/BundleProductSelector.vue | The component has been removed. Use packages/theme/modules/catalog/product/components/BundleProductSelector.vue instead | +| packages/theme/components/UpsellProducts.vue | The component has been removed | +| packages/theme/config.js | This file has been deleted. Use ENV variables instead | + +## API Client + +| File | what and how it changed | +|------------------------------------------|---------------------------------------------------------------------------| +| packages/api-client/package.json | - agentkeepalive dependency has been added, npm scripts have been updated | +| packages/api-client/possible-types.js | Magento URL env variable name has been changed | +| packages/api-client/src/types/GraphQL.ts | types have been updated | +| packages/api-client/src/types/setup.ts | types have been updated | diff --git a/docs/migration-guides/index.md b/docs/migration-guides/index.md new file mode 100644 index 000000000..eda652111 --- /dev/null +++ b/docs/migration-guides/index.md @@ -0,0 +1,3 @@ +# Migration guides + +- [1.0.0-rc.7](./1.0.0-rc.7/) diff --git a/internals/eslint-import/package.json b/internals/eslint-import/package.json index c50ed6a06..aa57a97e8 100644 --- a/internals/eslint-import/package.json +++ b/internals/eslint-import/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/eslint-config-import", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "author": "Heitor Ramon Ribeiro ", "license": "MIT", "scripts": { diff --git a/internals/eslint-jest/package.json b/internals/eslint-jest/package.json index 418868040..05e93deb1 100644 --- a/internals/eslint-jest/package.json +++ b/internals/eslint-jest/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/eslint-config-jest", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "author": "Heitor Ramon Ribeiro ", "license": "MIT", "scripts": { diff --git a/internals/eslint-typescript/package.json b/internals/eslint-typescript/package.json index d69df46b7..f07801f2f 100644 --- a/internals/eslint-typescript/package.json +++ b/internals/eslint-typescript/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/eslint-config-typescript", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "author": "Heitor Ramon Ribeiro ", "license": "MIT", "scripts": { diff --git a/internals/eslint-vue/package.json b/internals/eslint-vue/package.json index 5c7f68790..0f465e077 100644 --- a/internals/eslint-vue/package.json +++ b/internals/eslint-vue/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/eslint-config-vue", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "author": "Heitor Ramon Ribeiro ", "license": "MIT", "scripts": { diff --git a/internals/eslint/package.json b/internals/eslint/package.json index a78c451b5..429bc2761 100644 --- a/internals/eslint/package.json +++ b/internals/eslint/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/eslint-config-base", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "author": "Heitor Ramon Ribeiro ", "license": "MIT", "scripts": { diff --git a/package.json b/package.json index 3e16b983b..16d96e997 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "internals/*" ], "scripts": { - "build": "yarn build:api-client && yarn build:theme && yarn build:composables", + "build": "yarn build:api-client && yarn build:theme", "build:api-client": "cd packages/api-client && yarn build", "build:theme": "cd packages/theme && yarn build", "build:composables": "cd packages/composables && yarn build", @@ -26,6 +26,7 @@ "lint": "eslint . --ext .ts,.vue", "prepare": "[ -d '.husky' ] && (husky install && shx rm -rf .git/hooks && shx ln -s ../.husky .git/hooks) || true", "publish:api-client": "node ./scripts/publishApi.js", + "publish:composables": "node ./scripts/publishComposable.js", "start": "cd packages/theme && yarn start", "test": "yarn test:api-client && yarn test:theme", "test:api-client": "cd packages/api-client && yarn test --passWithNoTests", diff --git a/packages/api-client/README.md b/packages/api-client/README.md index ac5c3cf50..87ba9b077 100644 --- a/packages/api-client/README.md +++ b/packages/api-client/README.md @@ -30,7 +30,7 @@ vsf init && cd && yarn && yarn dev ## How to start if you want to contribute? -Want to contribute? Ping us on `magento2-vsf2` channel on [our Discord](http://discord.vuestorefront.io)! +Want to contribute? Ping us on `magento2` channel on [our Discord](http://discord.vuestorefront.io)! ### Requirements: - NodeJS v16 or later @@ -91,11 +91,12 @@ Find more information about the module [GraphQl Custom Config](https://github.co ## Support -If you have any questions about this integration we will be happy to answer them on `magento2-vsf2` channel on [our Discord](http://discord.vuestorefront.io). +If you have any questions about this integration we will be happy to answer them on `magento2` channel on [our Discord](http://discord.vuestorefront.io). ## Contributors ✨ ### Honorable Mentions +- [Caravel x](https://www.caravelx.com/) - [Cyberfuze](https://cyberfuze.com/) - [Leonex](https://www.leonex.de/) @@ -114,18 +115,24 @@ Thanks go to these wonderful people 🙌:
Patrick Monteiro

💻 -
Kevin Gorjan

💻 -
Bartosz Herba

💻 -
Marcin Kwiatkowski

💻 📆 +
Kevin Gorjan

💻 📖 +
Bartosz Herba

💻 📖 🚧 🧑‍🏫 👀 +
Marcin Kwiatkowski

💻 📆 💼 📖 🤔 🚧 🧑‍🏫 👀
Filip Rakowski

💬 🧑‍🏫 👀 -
Filip Sobol

💬 🧑‍🏫 👀 +
Filip Sobol

💬 🧑‍🏫 👀 📖
Patryk Andrzejewski

💬 🧑‍🏫 👀
Renan Oliveira

🔧 🔌
Dominik Deimel

💻 📖
Lior Lindvor

💻 + +
Artur Tagisow

💻 +
Jonathan Ribas

💻 +
Ali Ghanei

💻 +
Maya Shavin

📖 + @@ -134,4 +141,3 @@ Thanks go to these wonderful people 🙌: This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! - diff --git a/packages/api-client/package.json b/packages/api-client/package.json index 0416031a7..c8c32c79e 100644 --- a/packages/api-client/package.json +++ b/packages/api-client/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/magento-api", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "sideEffects": false, "homepage": "https://github.com/vuestorefront/magento2", "bugs": { diff --git a/packages/composables/README.md b/packages/composables/README.md index ac00d9f78..8c0ad9648 100644 --- a/packages/composables/README.md +++ b/packages/composables/README.md @@ -30,7 +30,7 @@ vsf init && cd && yarn && yarn dev ## How to start if you want to contribute? -Want to contribute? Ping us on `magento2-vsf2` channel on [our Discord](http://discord.vuestorefront.io)! +Want to contribute? Ping us on `magento2` channel on [our Discord](http://discord.vuestorefront.io)! ### Requirements: - NodeJS v16 or later @@ -91,11 +91,12 @@ Find more information about the module [GraphQl Custom Config](https://github.co ## Support -If you have any questions about this integration we will be happy to answer them on `magento2-vsf2` channel on [our Discord](http://discord.vuestorefront.io). +If you have any questions about this integration we will be happy to answer them on `magento2` channel on [our Discord](http://discord.vuestorefront.io). ## Contributors ✨ ### Honorable Mentions +- [Caravel x](https://www.caravelx.com/) - [Cyberfuze](https://cyberfuze.com/) - [Leonex](https://www.leonex.de/) @@ -114,18 +115,24 @@ Thanks go to these wonderful people 🙌:
Patrick Monteiro

💻 -
Kevin Gorjan

💻 -
Bartosz Herba

💻 -
Marcin Kwiatkowski

💻 📆 +
Kevin Gorjan

💻 📖 +
Bartosz Herba

💻 📖 🚧 🧑‍🏫 👀 +
Marcin Kwiatkowski

💻 📆 💼 📖 🤔 🚧 🧑‍🏫 👀
Filip Rakowski

💬 🧑‍🏫 👀 -
Filip Sobol

💬 🧑‍🏫 👀 +
Filip Sobol

💬 🧑‍🏫 👀 📖
Patryk Andrzejewski

💬 🧑‍🏫 👀
Renan Oliveira

🔧 🔌
Dominik Deimel

💻 📖
Lior Lindvor

💻 + +
Artur Tagisow

💻 +
Jonathan Ribas

💻 +
Ali Ghanei

💻 +
Maya Shavin

📖 + @@ -134,4 +141,3 @@ Thanks go to these wonderful people 🙌: This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! - diff --git a/packages/composables/package.json b/packages/composables/package.json index e4ce1b83a..150486ea5 100644 --- a/packages/composables/package.json +++ b/packages/composables/package.json @@ -1,25 +1,19 @@ { "name": "@vue-storefront/magento", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "license": "MIT", "homepage": "https://github.com/vuestorefront/magento2", "bugs": { "url": "https://github.com/vuestorefront/magento2/issues" }, "sideEffects": false, - "main": "./lib/index.js", - "exports": { - ".": "./lib/index.js", - "./nuxt": "./nuxt/index.js", - "./package.json": "./package.json" - }, + "main": "lib/index.cjs.js", + "module": "lib/index.es.js", + "tsModule": "src/index.ts", "types": "lib/index.d.ts", "scripts": { - "build": "yarn build:clear && yarn build:package && yarn build:types", - "build:clear": "rimraf lib", - "build:package": "node ../../scripts/build --file=src/index.ts", - "build:types": "tsc --emitDeclarationOnly", - "dev": "yarn build:package --watch", + "build": "rimraf lib && rollup -c", + "dev": "rimraf lib && rollup -c -w", "lint:fix": "eslint ./src --ext .ts,.vue --fix", "precommit": "lint-staged", "prepublish": "yarn build", @@ -28,8 +22,8 @@ "update:update": "ncu -u" }, "dependencies": { - "@vue-storefront/core": "~2.5.6", - "@vue-storefront/magento-api": "^1.0.0-rc.6", + "@vue-storefront/core": "~2.5.3", + "@vue-storefront/magento-api": "1.0.0-rc.5.2.2", "@vue/composition-api": "^1.4.1", "cookie-universal": "^2.1.5", "vue": "^2.6.14", diff --git a/packages/composables/src/composables/useCustomQuery/index.ts b/packages/composables/src/composables/useCustomQuery/index.ts index 766e0d46c..fd14f404f 100644 --- a/packages/composables/src/composables/useCustomQuery/index.ts +++ b/packages/composables/src/composables/useCustomQuery/index.ts @@ -8,6 +8,10 @@ import { } from '../../factories/useCustomQueryFactory'; import { FetchPolicy } from '../../types'; +/** + * @deprecated Will be removed in 1.1.0 release + * @use @vue-storefront/magento-theme/composables/useApi instead + */ export default useCustomQueryFactory({ query: async (context: Context, { query, diff --git a/packages/composables/src/factories/useCustomQueryFactory.ts b/packages/composables/src/factories/useCustomQueryFactory.ts index ddfc88631..9ea5b52f2 100644 --- a/packages/composables/src/factories/useCustomQueryFactory.ts +++ b/packages/composables/src/factories/useCustomQueryFactory.ts @@ -14,6 +14,10 @@ import { computed } from '@vue/composition-api'; import { FetchPolicy } from '../types'; import { UseCustomQuery } from '../types/composables'; +/** + * @deprecated Will be removed in 1.1.0 release + * @use @vue-storefront/magento-theme/composables/useApi instead + */ export interface UseCustomQueryFactoryFactoryParams extends FactoryParams { query: (context: Context, { variables, diff --git a/packages/theme/README.md b/packages/theme/README.md index 0d7928a01..c5247cf11 100644 --- a/packages/theme/README.md +++ b/packages/theme/README.md @@ -55,6 +55,7 @@ For detailed explanation on how things work, check out [Nuxt.js docs](https://nu ## Contributors ✨ ### Honorable Mentions +- [Caravel x](https://www.caravelx.com/) - [Cyberfuze](https://cyberfuze.com/) - [Leonex](https://www.leonex.de/) @@ -73,18 +74,24 @@ Thanks go to these wonderful people 🙌:
Patrick Monteiro

💻 -
Kevin Gorjan

💻 -
Bartosz Herba

💻 -
Marcin Kwiatkowski

💻 📆 +
Kevin Gorjan

💻 📖 +
Bartosz Herba

💻 📖 🚧 🧑‍🏫 👀 +
Marcin Kwiatkowski

💻 📆 💼 📖 🤔 🚧 🧑‍🏫 👀
Filip Rakowski

💬 🧑‍🏫 👀 -
Filip Sobol

💬 🧑‍🏫 👀 +
Filip Sobol

💬 🧑‍🏫 👀 📖
Patryk Andrzejewski

💬 🧑‍🏫 👀
Renan Oliveira

🔧 🔌
Dominik Deimel

💻 📖
Lior Lindvor

💻 + +
Artur Tagisow

💻 +
Jonathan Ribas

💻 +
Ali Ghanei

💻 +
Maya Shavin

📖 + diff --git a/packages/theme/package.json b/packages/theme/package.json index b89f52504..e70423467 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -1,6 +1,6 @@ { "name": "@vue-storefront/magento-theme", - "version": "1.0.0-rc.6", + "version": "1.0.0-rc.7", "private": true, "license": "MIT", "homepage": "https://github.com/vuestorefront/magento2", diff --git a/yarn.lock b/yarn.lock index 0aa28d574..f918e5fe8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,6 +16,24 @@ dependencies: "@types/throttle-debounce" "^2.1.0" +"@apollo/client@^3.5.6": + version "3.6.5" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.6.5.tgz#6a7baaf05852187b0eac1c6064e721d47326d70c" + integrity sha512-xGAZzv1f5abyH45MSU5eOLyGQuP4Ps0OhP36pSCtt6pCICI3n4yDkdftFCPvqDVqVTuciX1kkyeJPfGodz5kwg== + dependencies: + "@graphql-typed-document-node/core" "^3.1.1" + "@wry/context" "^0.6.0" + "@wry/equality" "^0.5.0" + "@wry/trie" "^0.3.0" + graphql-tag "^2.12.6" + hoist-non-react-statics "^3.3.2" + optimism "^0.16.1" + prop-types "^15.7.2" + symbol-observable "^4.0.0" + ts-invariant "^0.10.3" + tslib "^2.3.0" + zen-observable-ts "^1.2.5" + "@apollo/client@^3.5.8", "@apollo/client@~3.2.5 || ~3.3.0 || ~3.4.0 || ~3.5.0": version "3.5.10" resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.5.10.tgz#43463108a6e07ae602cca0afc420805a19339a71" @@ -1718,7 +1736,7 @@ tslib "~2.3.0" value-or-promise "1.0.11" -"@graphql-typed-document-node/core@^3.0.0": +"@graphql-typed-document-node/core@^3.0.0", "@graphql-typed-document-node/core@^3.1.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@graphql-typed-document-node/core/-/core-3.1.1.tgz#076d78ce99822258cf813ecc1e7fa460fa74d052" integrity sha512-NQ17ii0rK1b34VZonlmT2QMJFI70m0TRwbknO/ihlbatXyaktDhN/98vBiUU6kNBPljqGqyIrl2T4nY2RpFANg== @@ -4364,6 +4382,16 @@ dependencies: "@vue-storefront/core" "~2.5.6" +"@vue-storefront/core@~2.5.3": + version "2.5.13" + resolved "https://registry.yarnpkg.com/@vue-storefront/core/-/core-2.5.13.tgz#ad7cf7c8f7a51b521202c5cb81b0511c7f1ffab8" + integrity sha512-o8mS+nha9FYgYaQdFKYbx0WEx2qtYErjeqGgtdCC1F435SliVctuxhBg5CxGkPPfk6tGO7BBAaOWMUr5Qp5ZFg== + dependencies: + axios "0.21.1" + express "^4.17.1" + lodash-es "^4.17.15" + vue "^2.6.11" + "@vue-storefront/core@~2.5.6": version "2.5.6" resolved "https://registry.yarnpkg.com/@vue-storefront/core/-/core-2.5.6.tgz#dfbfce48487a9a4a6b34576fb23d625ed0ebfada" @@ -4375,6 +4403,16 @@ lodash-es "^4.17.15" vue "^2.6.11" +"@vue-storefront/magento-api@1.0.0-rc.5.2.2": + version "1.0.0-rc.5.2.2" + resolved "https://registry.yarnpkg.com/@vue-storefront/magento-api/-/magento-api-1.0.0-rc.5.2.2.tgz#224e2880f2d7a5a5f90117fa7211823978893d98" + integrity sha512-acIvzcfOvyykCIqRbu+clZHPv/1WQwJTSba5X8Jtmm32V1B7nJjg1+NFAtzBmvNZFPQWIHD+2tz5KM0SSHpG0g== + dependencies: + "@apollo/client" "^3.5.6" + graphql "^16.2.0" + graphql-tag "^2.12.6" + isomorphic-fetch "^3.0.0" + "@vue-storefront/middleware@~2.5.6": version "2.5.6" resolved "https://registry.yarnpkg.com/@vue-storefront/middleware/-/middleware-2.5.6.tgz#ab9ba8e5b3ac15bc7b24a32ab3d9de5bcf0b7c7e" @@ -10421,6 +10459,11 @@ graphql@^15.5.1: resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== +graphql@^16.2.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.5.0.tgz#41b5c1182eaac7f3d47164fb247f61e4dfb69c85" + integrity sha512-qbHgh8Ix+j/qY+a/ZcJnFQ+j8ezakqPiHwPiZhV/3PgGlgf96QMBB5/f2rkiC9sgLoy/xvT6TSiaf2nTHJh5iA== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -18926,6 +18969,13 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== +ts-invariant@^0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.10.3.tgz#3e048ff96e91459ffca01304dbc7f61c1f642f6c" + integrity sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ== + dependencies: + tslib "^2.1.0" + ts-invariant@^0.9.4: version "0.9.4" resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.9.4.tgz#42ac6c791aade267dd9dc65276549df5c5d71cac" @@ -20488,6 +20538,13 @@ zen-observable-ts@^1.2.0: dependencies: zen-observable "0.8.15" +zen-observable-ts@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-1.2.5.tgz#6c6d9ea3d3a842812c6e9519209365a122ba8b58" + integrity sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg== + dependencies: + zen-observable "0.8.15" + zen-observable@0.8.15: version "0.8.15" resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" From 7d5eb9e6d16dc5bfc48a4f89556d0ad9d0b8bad5 Mon Sep 17 00:00:00 2001 From: Alexander Devitsky Date: Thu, 26 May 2022 08:36:34 +0300 Subject: [PATCH 429/486] feat: add product to cart from wishlist (#1026) * feat: add product to cart from wishlist * refactor: removed product getters from usewishlist composable Co-authored-by: Alexander Devitsky --- packages/theme/lang/de.js | 1 + packages/theme/lang/en.js | 1 + .../__tests__/CategoryProductGrid.spec.ts | 10 ++++ .../__tests__/CategoryProductList.spec.ts | 10 ++++ .../theme/modules/catalog/pages/product.vue | 10 ++-- .../checkout/composables/useCart/index.ts | 11 ++++- .../customer/pages/MyAccount/MyWishlist.vue | 36 +++++++++++---- .../wishlist/components/WishlistSidebar.vue | 45 ++++++++++-------- .../wishlist/composables/useWishlist/index.ts | 46 +++++++++++++++++++ .../composables/useWishlist/useWishlist.ts | 14 ++++++ 10 files changed, 151 insertions(+), 33 deletions(-) diff --git a/packages/theme/lang/de.js b/packages/theme/lang/de.js index 7645ac19d..fbde7770a 100644 --- a/packages/theme/lang/de.js +++ b/packages/theme/lang/de.js @@ -194,6 +194,7 @@ export default { "Who we are": "Wer wir sind", "Wishlist": "Wunschliste", "Women fashion": "Damenmode", + "You added {product} to your shopping cart.": "Sie haben {product} zu Ihrem Warenkorb hinzugefügt.", "You are not authorized, please log in": "Sie sind nicht autorisiert, bitte melden Sie sich an", "You can unsubscribe at any time": "Sie können sich jederzeit abmelden", "You currently have no orders": "Sie haben derzeit keine Bestellungen", diff --git a/packages/theme/lang/en.js b/packages/theme/lang/en.js index b9c5af3c9..cd39389ed 100644 --- a/packages/theme/lang/en.js +++ b/packages/theme/lang/en.js @@ -188,6 +188,7 @@ export default { "Who we are": "Who we are", "Wishlist": "Wishlist", "Women fashion": "Women fashion", + "You added {product} to your shopping cart.": "You added {product} to your shopping cart.", "You are not authorized, please log in": "You are not authorized, please log in", "You can unsubscribe at any time": "You can unsubscribe at any time", "You currently have no orders": "You currently have no orders", diff --git a/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductGrid.spec.ts b/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductGrid.spec.ts index d1bb9d173..54fb332ca 100644 --- a/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductGrid.spec.ts +++ b/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductGrid.spec.ts @@ -8,6 +8,16 @@ import { productsMock } from './productsMock'; const localVue = createLocalVue(); localVue.use(PiniaVuePlugin); +jest.mock('~/composables', () => { + const originalComposables = jest.requireActual('~/composables'); + return { + ...originalComposables, + useUiNotification: jest.fn(() => ({ + send: jest.fn(), + })), + }; +}); + describe('CategoryProductGrid', () => { it('shows skeleton loader when loading', async () => { const { findAllByTestId } = render(CategoryProductGrid, { props: { loading: true, products: [] }, localVue, pinia: createTestingPinia() }); diff --git a/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductList.spec.ts b/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductList.spec.ts index c66ca0bc1..51eeaced6 100644 --- a/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductList.spec.ts +++ b/packages/theme/modules/catalog/category/components/views/__tests__/CategoryProductList.spec.ts @@ -8,6 +8,16 @@ import CategoryProductList from '../CategoryProductList.vue'; const localVue = createLocalVue(); localVue.use(PiniaVuePlugin); +jest.mock('~/composables', () => { + const originalComposables = jest.requireActual('~/composables'); + return { + ...originalComposables, + useUiNotification: jest.fn(() => ({ + send: jest.fn(), + })), + }; +}); + describe('CategoryProductList', () => { it.each([ [true, true], diff --git a/packages/theme/modules/catalog/pages/product.vue b/packages/theme/modules/catalog/pages/product.vue index 866c4f638..5a2d7cafb 100644 --- a/packages/theme/modules/catalog/pages/product.vue +++ b/packages/theme/modules/catalog/pages/product.vue @@ -84,9 +84,11 @@ export default defineComponent({ eq: id, }, }, - configurations: Object.entries(route.value.query).map( - (config) => config[1], - ) as string[], + configurations: Object.entries(route.value.query) + .filter((config) => config[0] !== 'wishlist') + .map( + (config) => config[1], + ) as string[], }); // eslint-disable-next-line no-underscore-dangle @@ -108,7 +110,7 @@ export default defineComponent({ const tags = [ { prefix: CacheTagPrefix.View, - value: `product-${route.value.params.id}`, + value: `product-${id}`, }, ]; diff --git a/packages/theme/modules/checkout/composables/useCart/index.ts b/packages/theme/modules/checkout/composables/useCart/index.ts index 894c3972c..dedc6148d 100644 --- a/packages/theme/modules/checkout/composables/useCart/index.ts +++ b/packages/theme/modules/checkout/composables/useCart/index.ts @@ -1,5 +1,5 @@ import { - computed, readonly, ref, useContext, + computed, readonly, ref, useContext, useRoute, } from '@nuxtjs/composition-api'; import { addItemCommand } from '~/modules/checkout/composables/useCart/commands/addItemCommand'; import { applyCouponCommand } from '~/modules/checkout/composables/useCart/commands/applyCouponCommand'; @@ -12,6 +12,7 @@ import { updateItemQtyCommand } from '~/modules/checkout/composables/useCart/com import { Logger } from '~/helpers/logger'; import { Cart, CartItemInterface, ProductInterface } from '~/modules/GraphQL/types'; import { useCartStore } from '~/modules/checkout/stores/cart'; +import { useWishlist } from '~/modules/wishlist/composables/useWishlist'; import { UseCartErrors, UseCartInterface } from './useCart'; import { Product } from '~/modules/catalog/product/types'; @@ -38,9 +39,11 @@ PRODUCT }); const { app } = useContext(); const context = app.$vsf; + const route = useRoute(); const cartStore = useCartStore(); const cart = computed(() => cartStore.cart as CART); const apiState = context.$magento.config.state; + const { loading: wishlistLoading, afterAddingWishlistItemToCart } = useWishlist(); /** * Assign new cart object @@ -143,6 +146,12 @@ PRODUCT error.value.addItem = err; Logger.error('useCart/addItem', err); } finally { + if (!wishlistLoading.value && route.value.query?.wishlist) { + afterAddingWishlistItemToCart({ + product, + cartError: error.value.addItem, + }); + } loading.value = false; } }; diff --git a/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue b/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue index 8fb799d0a..0d0b340e6 100644 --- a/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue +++ b/packages/theme/modules/customer/pages/MyAccount/MyWishlist.vue @@ -68,6 +68,7 @@ wishlist-icon is-in-wishlist show-add-to-cart-button + :add-to-cart-disabled="isCartLoading" @click:wishlist="removeItemFromWishlist(product.product)" @click:add-to-cart=" addItemToCart({ product: product.product, quantity: 1 }) @@ -142,7 +143,7 @@ import wishlistGetters from '~/modules/wishlist/getters/wishlistGetters'; import { useCart } from '~/modules/checkout/composables/useCart'; import { useWishlistStore } from '~/modules/wishlist/store/wishlistStore'; import EmptyWishlist from '~/modules/wishlist/components/EmptyWishlist.vue'; - +import { ProductTypeEnum } from '~/modules/catalog/product/enums/ProductTypeEnum'; import { useUiHelpers, useImage } from '~/composables'; export default defineComponent({ @@ -158,16 +159,24 @@ export default defineComponent({ }, setup() { const { - load, loading, removeItem, + load, + loading, + removeItem, + afterAddingWishlistItemToCart, } = useWishlist(); const route = useRoute(); - const { app } = useContext(); + const { localeRoute } = useContext(); const { query: { page, itemsPerPage }, } = route.value; const router = useRouter(); const th = useUiHelpers(); - const { addItem: addItemToCartBase, isInCart } = useCart(); + const { + addItem: addItemToCartBase, + error: cartError, + isInCart, + loading: isCartLoading, + } = useCart(); const wishlistStore = useWishlistStore(); const products = computed(() => wishlistGetters.getProducts(wishlistStore.wishlist)); @@ -178,18 +187,28 @@ export default defineComponent({ const productType = product.__typename; switch (productType) { - case 'SimpleProduct': + case ProductTypeEnum.SIMPLE_PRODUCT: await addItemToCartBase({ product, quantity, }); + afterAddingWishlistItemToCart({ + product, + cartError: cartError.value.addItem, + }); break; - case 'BundleProduct': - case 'ConfigurableProduct': + case ProductTypeEnum.CONFIGURABLE_PRODUCT: + case ProductTypeEnum.BUNDLE_PRODUCT: + case ProductTypeEnum.GROUPED_PRODUCT: const path = `/p/${productGetters.getProductSku( product, )}${productGetters.getSlug(product, product.categories[0])}`; - await router.push(`${app.localePath(path)}`); + await router.push(localeRoute({ + path, + query: { + wishlist: 'true', + }, + })); break; default: throw new Error( @@ -217,6 +236,7 @@ export default defineComponent({ addItemToCart, removeItemFromWishlist, isInCart, + isCartLoading, loading, pagination, productGetters, diff --git a/packages/theme/modules/wishlist/components/WishlistSidebar.vue b/packages/theme/modules/wishlist/components/WishlistSidebar.vue index b04dd9248..d618719a1 100644 --- a/packages/theme/modules/wishlist/components/WishlistSidebar.vue +++ b/packages/theme/modules/wishlist/components/WishlistSidebar.vue @@ -48,14 +48,7 @@ :regular-price=" $fc(getItemPrice(wishlistItem).regular) " - :link=" - localePath( - `/p/${wishlistItem.product.sku}${productGetters.getSlug( - wishlistItem.product, - wishlistItem.product.categories[0] - )}` - ) - " + :link="getItemLink(wishlistItem)" :special-price="getItemPrice(wishlistItem).special && $fc(getItemPrice(wishlistItem).special)" :stock="99999" class="collected-product" @@ -65,16 +58,7 @@
From 2da50398cc7abe79cde6cfe793b9d1ce28223229 Mon Sep 17 00:00:00 2001 From: Marcin Kwiatkowski Date: Wed, 8 Jun 2022 08:30:22 +0200 Subject: [PATCH 474/486] fix: m2-739. Removed filters skeleton on mobile devices (#1100) --- .../catalog/category/components/filters/CategoryFilters.vue | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/theme/modules/catalog/category/components/filters/CategoryFilters.vue b/packages/theme/modules/catalog/category/components/filters/CategoryFilters.vue index 6494e8a2e..c172d7248 100644 --- a/packages/theme/modules/catalog/category/components/filters/CategoryFilters.vue +++ b/packages/theme/modules/catalog/category/components/filters/CategoryFilters.vue @@ -10,6 +10,7 @@
Date: Fri, 3 Jun 2022 12:30:37 +0200 Subject: [PATCH 475/486] refactor: break down login modal into separate components and add unit tests fix: loading state not appearing refactor: add types for forms fix: squash this test: no pinia needed here refactor: minor renamings chore: update @testing-library pkgs so tests pass test: remove old login modal tests refactor: add registerfragment tests and fix misc issues test: don't mutate vee-validate rules this is not ideal, as changing the validation translation label would require chaing the tests, but this is a job for M2-746, where vee-validat extends() could be moved to a Nuxt plugin test: add forgot password test refactor: remove unused keys from fragments test: add more tests for forgotpassword refactor: move loginmodal to customer module chore: flatten test code whitespace fix: loginmodal path fix: broken paths after move to customer module refactor: add login modal tests refactor: re-add login state refactor: remove unnecessary extend() refactor: use less verbose mapper name refactor: add translation function refactor: unify to use named import refactor: use _ instead of _props --- .eslintrc.js | 2 +- packages/theme/components/LoginModal.vue | 580 ------------------ .../components/__tests__/LoginModal.spec.js | 220 ------- packages/theme/jest-setup.js | 7 +- packages/theme/lang/de.js | 1 + packages/theme/lang/en.js | 1 + packages/theme/layouts/default.vue | 12 +- .../components/LoginModal/LoginModal.vue | 232 +++++++ .../LoginModal/__tests__/LoginModal.spec.ts | 171 ++++++ .../LoginModal/forms/ForgotPasswordForm.vue | 97 +++ .../forms/ForgotPasswordThankYou.vue | 25 + .../components/LoginModal/forms/LoginForm.vue | 150 +++++ .../LoginModal/forms/RegisterForm.vue | 180 ++++++ .../__tests__/ForgotPasswordForm.spec.ts | 29 + .../forms/__tests__/LoginForm.spec.ts | 66 ++ .../forms/__tests__/RegisterForm.spec.ts | 51 ++ .../components/LoginModal/forms/styles.scss | 19 + .../components/LoginModal/forms/types.ts | 15 + packages/theme/package.json | 6 +- packages/theme/types/vueTestingLibrary.ts | 3 + yarn.lock | 24 +- 21 files changed, 1071 insertions(+), 820 deletions(-) delete mode 100644 packages/theme/components/LoginModal.vue delete mode 100644 packages/theme/components/__tests__/LoginModal.spec.js create mode 100644 packages/theme/modules/customer/components/LoginModal/LoginModal.vue create mode 100644 packages/theme/modules/customer/components/LoginModal/__tests__/LoginModal.spec.ts create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordForm.vue create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordThankYou.vue create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/LoginForm.vue create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/RegisterForm.vue create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/__tests__/ForgotPasswordForm.spec.ts create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/__tests__/LoginForm.spec.ts create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/__tests__/RegisterForm.spec.ts create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/styles.scss create mode 100644 packages/theme/modules/customer/components/LoginModal/forms/types.ts create mode 100644 packages/theme/types/vueTestingLibrary.ts diff --git a/.eslintrc.js b/.eslintrc.js index 5327c1907..976fd049c 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,7 +35,7 @@ module.exports = { "jest/expect-expect": [ "error", { - "assertFunctionNames": ["expect", "getByRole", "getByTestId"], + "assertFunctionNames": ["expect", "getByRole", "getByTestId", "getByText"], } ], "no-plusplus": "off", diff --git a/packages/theme/components/LoginModal.vue b/packages/theme/components/LoginModal.vue deleted file mode 100644 index c92fdccc6..000000000 --- a/packages/theme/components/LoginModal.vue +++ /dev/null @@ -1,580 +0,0 @@ - - - - diff --git a/packages/theme/components/__tests__/LoginModal.spec.js b/packages/theme/components/__tests__/LoginModal.spec.js deleted file mode 100644 index 3c7e1652c..000000000 --- a/packages/theme/components/__tests__/LoginModal.spec.js +++ /dev/null @@ -1,220 +0,0 @@ -/* eslint-disable @typescript-eslint/no-unsafe-argument */ -import { ref } from '@nuxtjs/composition-api'; -import userEvent from '@testing-library/user-event'; -import { waitFor } from '@testing-library/vue'; -import { useForgotPassword, useCart } from '~/composables'; -import { useUser } from '~/modules/customer/composables/useUser'; -import { - render, useUserMock, useForgotPasswordMock, useCartMock, -} from '~/test-utils'; -import { useUiState } from '~/composables/useUiState'; - -import LoginModal from '../LoginModal'; - -jest.mock('~/composables/useUiState', () => jest.fn()); -jest.mock('~/composables', () => ({ - useUser: jest.fn(), - useCart: jest.fn(), - useForgotPassword: jest.fn(), - useWishlist: jest.fn().mockReturnValue({ - load: jest.fn(), - loadItemsCount: jest.fn(), - }), -})); - -describe.skip('', () => { - useCart.mockReturnValue(useCartMock()); - it('User can log in', async () => { - useUiState.mockReturnValue({ - isLoginModalOpen: ref(true), - toggleLoginModal: jest.fn(), - }); - const loginMock = jest.fn(); - useForgotPassword.mockReturnValue(useForgotPasswordMock()); - useUser.mockReturnValue(useUserMock({ - login: loginMock, - })); - - const values = { - email: 'james@bond.io', - password: 'J@mesBond007!', - token: 'recaptcha token', - }; - - const $recaptchaInstance = { - init: jest.fn(), - reset: jest.fn(), - getResponse: jest.fn().mockResolvedValue(Promise.resolve(values.token)), - }; - const { getByRole, findByLabelText, queryByTestId } = render(LoginModal, { - mocks: { - $nuxt: { - context: { - $config: { isRecaptcha: true }, - $recaptcha: $recaptchaInstance, - }, - }, - }, - }); - - const recaptchaComponent = queryByTestId('recaptcha'); - expect(recaptchaComponent).toBeTruthy(); - - const emailInput = getByRole('textbox', { name: /your email/i }); - const passwordInput = await findByLabelText('Password'); - - userEvent.type(emailInput, values.email); - userEvent.type(passwordInput, values.password); - - const submitButton = getByRole('button', { name: /login/i }); - userEvent.click(submitButton); - - await waitFor(() => { - expect(loginMock).toHaveBeenCalledTimes(1); - expect(loginMock).toHaveBeenCalledWith({ - user: { - username: values.email, - password: values.password, - is_subscribed: false, - recaptchaInstance: $recaptchaInstance, - recaptchaToken: values.token, - }, - }); - }); - }); - - it('User can register', async () => { - const registerMock = jest.fn(); - useForgotPassword.mockReturnValue(useForgotPasswordMock()); - useUser.mockReturnValue(useUserMock({ - register: registerMock, - })); - useUiState.mockReturnValue({ - isLoginModalOpen: ref(true), - toggleLoginModal: jest.fn(), - }); - - const values = { - email: 'james@bond.io', - firstName: 'James', - lastName: 'Bond', - password: 'J@mesBond007!', - token: 'recaptcha token', - }; - - const $recaptchaInstance = { - init: jest.fn(), - reset: jest.fn(), - getResponse: jest.fn().mockResolvedValue(Promise.resolve(values.token)), - }; - const { - getByRole, - findByRole, - findByLabelText, - queryByTestId, - } = render(LoginModal, { - mocks: { - $nuxt: { - context: { - $config: { isRecaptcha: true }, - $recaptcha: $recaptchaInstance, - }, - }, - }, - }); - - const switchToRegisterButton = getByRole('button', { name: /register today/i }); - userEvent.click(switchToRegisterButton); - - await waitFor(() => findByRole('button', { name: /create an account/i })); - - const recaptchaComponent = queryByTestId('recaptcha'); - expect(recaptchaComponent).toBeTruthy(); - - const emailInput = getByRole('textbox', { name: /your email/i }); - const firstNameInput = getByRole('textbox', { name: /first name/i }); - const lastNameInput = getByRole('textbox', { name: /last name/i }); - const passwordInput = await findByLabelText('Password'); - const newsletterCheckbox = getByRole('checkbox', { name: /sign up for newsletter/i }); - const createAccountCheckbox = getByRole('checkbox', { name: /i want to create an account/i }); - - userEvent.type(emailInput, values.email); - userEvent.type(firstNameInput, values.firstName); - userEvent.type(lastNameInput, values.lastName); - userEvent.type(passwordInput, values.password); - userEvent.click(newsletterCheckbox); - userEvent.click(createAccountCheckbox); - - const submitButton = getByRole('button', { name: /create an account/i }); - userEvent.click(submitButton); - - await waitFor(() => { - expect(registerMock).toHaveBeenCalledTimes(1); - expect(registerMock).toHaveBeenCalledWith({ - user: { - email: values.email, - firstName: values.firstName, - is_subscribed: true, - lastName: values.lastName, - password: values.password, - recaptchaInstance: $recaptchaInstance, - recaptchaToken: values.token, - }, - }); - }); - }); - - it('User can reset his password', async () => { - const requestPasswordMock = jest.fn(); - useForgotPassword.mockReturnValue(useForgotPasswordMock({ - request: requestPasswordMock, - })); - useUser.mockReturnValue(useUserMock()); - useUiState.mockReturnValue({ - isLoginModalOpen: ref(true), - toggleLoginModal: jest.fn(), - }); - - const values = { - email: 'james@bond.io', - token: 'recaptcha token', - }; - - const { getByRole, findByRole, queryByTestId } = render(LoginModal, { - mocks: { - $nuxt: { - context: { - $config: { isRecaptcha: true }, - $recaptcha: { - init: jest.fn(), - reset: jest.fn(), - getResponse: jest.fn().mockResolvedValue(Promise.resolve(values.token)), - }, - }, - }, - }, - }); - - const forgottenPasswordButton = getByRole('button', { name: /forgotten password/i }); - userEvent.click(forgottenPasswordButton); - - await waitFor(() => findByRole('button', { name: /reset password/i })); - - const recaptchaComponent = queryByTestId('recaptcha'); - expect(recaptchaComponent).toBeTruthy(); - - const emailInput = getByRole('textbox', { name: /email/i }); - userEvent.type(emailInput, values.email); - - const submitButton = getByRole('button', { name: /reset password/i }); - userEvent.click(submitButton); - - await waitFor(() => { - expect(requestPasswordMock).toHaveBeenCalledTimes(1); - expect(requestPasswordMock).toHaveBeenCalledWith({ - email: values.email, - recaptchaToken: values.token, - }); - }); - }); -}); diff --git a/packages/theme/jest-setup.js b/packages/theme/jest-setup.js index 562c96659..0e7f0a192 100644 --- a/packages/theme/jest-setup.js +++ b/packages/theme/jest-setup.js @@ -14,7 +14,9 @@ const $vsf = { config: { imageProvider: '', magentoBaseUrl: '', - state: {}, + state: { + getMessage: jest.fn(), + }, }, }, }; @@ -29,6 +31,9 @@ Vue.prototype.$nuxt = { app: { // $vsf intentionally doubled in context top level AND in context.app - this is the way it's in the app $vsf, + context: { + $vsf, + }, $fc: jest.fn((label) => label), localePath: jest.fn((link) => link), localeRoute: jest.fn(() => 'some_url'), diff --git a/packages/theme/lang/de.js b/packages/theme/lang/de.js index fbde7770a..d90c50b9d 100644 --- a/packages/theme/lang/de.js +++ b/packages/theme/lang/de.js @@ -179,6 +179,7 @@ export default { "Subtotal price": "Zwischensumme Preis", "Successful placed order": "Sie haben die Bestellung erfolgreich aufgegeben. Sie können den Status Ihres Bestellen Sie über unsere Lieferstatusfunktion. Sie erhalten eine Bestellung Bestätigungs-E-Mail mit Details Ihrer Bestellung und einem Link zum Verfolgen der Bestellung Fortschritt.", "Terms and conditions": "Allgemeine Geschäftsbedingungen", + "Thank you": "Danke", "Thank You Inbox": "Wenn die Nachricht nicht in Ihrem Posteingang ankommt, versuchen Sie es mit einer anderen E-Mail-Adresse, mit der Sie sich möglicherweise registriert haben.", "Total": "Gesamt", "Total items": "Gesamtanzahl", diff --git a/packages/theme/lang/en.js b/packages/theme/lang/en.js index cd39389ed..7c6ac93a1 100644 --- a/packages/theme/lang/en.js +++ b/packages/theme/lang/en.js @@ -174,6 +174,7 @@ export default { "Subtotal price": "Subtotal price", "Successful placed order": "You have successfully placed the order. You can check status of your order by using our delivery status feature. You will receive an order confirmation e-mail with details of your order and a link to track its progress.", "Terms and conditions": "Terms and conditions", + "Thank you": "Thank you", "Thank You Inbox": "If the message is not arriving in your inbox, try another email address you might’ve used to register.", "Total": "Total", "Total items": "Total items", diff --git a/packages/theme/layouts/default.vue b/packages/theme/layouts/default.vue index 1873ea8e7..e4fd2b9e9 100644 --- a/packages/theme/layouts/default.vue +++ b/packages/theme/layouts/default.vue @@ -3,7 +3,10 @@ - + @@ -41,18 +44,21 @@ export default defineComponent({ AppFooter: () => import(/* webpackPrefetch: true */ '~/components/AppFooter.vue'), CartSidebar: () => import(/* webpackPrefetch: true */ '~/components/CartSidebar.vue'), WishlistSidebar: () => import(/* webpackPrefetch: true */ '~/modules/wishlist/components/WishlistSidebar.vue'), - LoginModal: () => import(/* webpackPrefetch: true */ '~/components/LoginModal.vue'), + LoginModal: () => import(/* webpackPrefetch: true */ '~/modules/customer/components/LoginModal/LoginModal.vue'), Notification: () => import(/* webpackPrefetch: true */ '~/components/Notification.vue'), }, setup() { const route = useRoute(); - const { isCartSidebarOpen, isWishlistSidebarOpen, isLoginModalOpen } = useUiState(); + const { + isCartSidebarOpen, isWishlistSidebarOpen, isLoginModalOpen, toggleLoginModal, + } = useUiState(); return { isCartSidebarOpen, isWishlistSidebarOpen, isLoginModalOpen, + toggleLoginModal, route, }; }, diff --git a/packages/theme/modules/customer/components/LoginModal/LoginModal.vue b/packages/theme/modules/customer/components/LoginModal/LoginModal.vue new file mode 100644 index 000000000..0c005bee9 --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/LoginModal.vue @@ -0,0 +1,232 @@ + + + + diff --git a/packages/theme/modules/customer/components/LoginModal/__tests__/LoginModal.spec.ts b/packages/theme/modules/customer/components/LoginModal/__tests__/LoginModal.spec.ts new file mode 100644 index 000000000..27fc1539a --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/__tests__/LoginModal.spec.ts @@ -0,0 +1,171 @@ +/* eslint-disable no-underscore-dangle */ +import { render, waitFor } from '@testing-library/vue'; +import { ref } from '@nuxtjs/composition-api'; +import { createLocalVue } from '@vue/test-utils'; +import { PiniaVuePlugin } from 'pinia'; +import { createTestingPinia } from '@pinia/testing'; +import { useUser } from '~/modules/customer/composables/useUser'; +import { useForgotPassword } from '~/modules/customer/composables/useForgotPassword'; +import { HTMLElementWithVue } from '~/types/vueTestingLibrary'; +import LoginModal from '../LoginModal.vue'; +import { ForgotPasswordFormFields, LoginFormFields, RegisterFormFields } from '../forms/types'; + +const localVue = createLocalVue(); +localVue.use(PiniaVuePlugin); + +jest.mock('~/composables/useUiState', () => ({ useUiState: () => ({ isLoginModalOpen: true }) })); +jest.mock('~/modules/customer/composables/useUser', () => ({ useUser: jest.fn() })); +const useUserMock = { + login: jest.fn(), + register: jest.fn(), + loading: ref(false), + error: ref({ login: null }), +}; +(useUser as jest.Mock).mockReturnValue(useUserMock); + +jest.mock('~/modules/customer/composables/useForgotPassword', () => ({ useForgotPassword: jest.fn() })); +const useForgotPasswordMock = { + request: jest.fn(), + error: { value: { request: null, setNew: null } }, + loading: ref(false), +}; +(useForgotPassword as jest.Mock).mockReturnValue(useForgotPasswordMock); + +describe('LoginModal', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + it('renders login form initially', () => { + const { getByTestId } = render(LoginModal, { + props: { isLoginModalOpen: true }, + localVue, + pinia: createTestingPinia(), + }); + getByTestId('login-form'); + }); + + it('sends login form', async () => { + const { getByTestId } = render(LoginModal, { + localVue, + pinia: createTestingPinia(), + }); + const loginForm = getByTestId('login-form'); + const form : LoginFormFields = { + email: 'john@smith.com', + password: 'P@ssw0rd!', + }; + await waitFor(() => { + (loginForm as HTMLElementWithVue).__vue__.$emit('submit', form); + }); + + expect(useUserMock.login).toHaveBeenCalled(); + }); + + it('displays error message if login fails', async () => { + const useUserMockWithError = { + login: jest.fn(), + register: jest.fn(), + loading: false, + error: { login: { message: 'error:login' } }, + }; + (useUser as jest.Mock).mockReturnValueOnce(useUserMockWithError); + const { getByText } = render(LoginModal, { + localVue, + pinia: createTestingPinia(), + }); + await waitFor(() => { + getByText('error:login'); + }); + }); + + it('sends register form', async () => { + const { getByTestId } = render(LoginModal, { + localVue, + pinia: createTestingPinia(), + }); + + await waitFor(() => { + (getByTestId('login-form') as HTMLElementWithVue).__vue__.$emit('go-to-register'); + }); + const registerForm = getByTestId('register-form') as HTMLElementWithVue; + const form : RegisterFormFields = { + email: 'john@smith.com', + password: 'P@ssw0rd!', + firstName: 'John', + lastName: 'Smith', + isWillToCreateAccountConfirmed: true, + shouldSubscribeToNewsletter: false, + }; + registerForm.__vue__.$emit('submit', form); + + await waitFor(() => { + expect(useUserMock.register).toHaveBeenCalled(); + }); + }); + + it('displays error message if register fails', async () => { + const useUserMockWithError = { + login: jest.fn(), + register: jest.fn(), + loading: false, + error: { register: { message: 'error:register' } }, + }; + (useUser as jest.Mock).mockReturnValueOnce(useUserMockWithError); + const { getByText, getByTestId } = render(LoginModal, { + localVue, + pinia: createTestingPinia(), + }); + + await waitFor(() => { + (getByTestId('login-form') as HTMLElementWithVue).__vue__.$emit('go-to-register'); + }); + await waitFor(() => { + getByText('error:register'); + }); + }); + + it('sends forgot password form and shows thank you page', async () => { + const { getByTestId, getByText } = render(LoginModal, { + localVue, + pinia: createTestingPinia(), + stubs: ['i18n'], + }); + + await waitFor(() => { + (getByTestId('login-form') as HTMLElementWithVue).__vue__.$emit('go-to-forgot-password'); + }); + const forgotPasswordForm = getByTestId('forgot-password-form') as HTMLElementWithVue; + const form : ForgotPasswordFormFields = { + username: 'john@smith.com', + }; + + forgotPasswordForm.__vue__.$emit('submit', form); + + await waitFor(() => { + getByTestId('forgot-password-thank-you'); + getByText('john@smith.com'); + expect(useForgotPasswordMock.request).toHaveBeenCalled(); + }); + }); + + it('displays error message if forgot password from send fails', async () => { + const useForgotPasswordMockWithError = { + request: jest.fn(), + error: { request: { message: 'error:forgotpassword' }, setNew: null }, + register: jest.fn(), + loading: false, + }; + (useForgotPassword as jest.Mock).mockReturnValueOnce(useForgotPasswordMockWithError); + const { getByText, getByTestId } = render(LoginModal, { + localVue, + pinia: createTestingPinia(), + }); + + await waitFor(() => { + (getByTestId('login-form') as HTMLElementWithVue).__vue__.$emit('go-to-forgot-password'); + }); + await waitFor(() => { + getByText('error:forgotpassword'); + }); + }); +}); diff --git a/packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordForm.vue b/packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordForm.vue new file mode 100644 index 000000000..8ec58844c --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordForm.vue @@ -0,0 +1,97 @@ + + + + diff --git a/packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordThankYou.vue b/packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordThankYou.vue new file mode 100644 index 000000000..b5efc6c65 --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/ForgotPasswordThankYou.vue @@ -0,0 +1,25 @@ + + + + + diff --git a/packages/theme/modules/customer/components/LoginModal/forms/LoginForm.vue b/packages/theme/modules/customer/components/LoginModal/forms/LoginForm.vue new file mode 100644 index 000000000..835209a31 --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/LoginForm.vue @@ -0,0 +1,150 @@ + + + + diff --git a/packages/theme/modules/customer/components/LoginModal/forms/RegisterForm.vue b/packages/theme/modules/customer/components/LoginModal/forms/RegisterForm.vue new file mode 100644 index 000000000..9fe2eaa83 --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/RegisterForm.vue @@ -0,0 +1,180 @@ + + + + diff --git a/packages/theme/modules/customer/components/LoginModal/forms/__tests__/ForgotPasswordForm.spec.ts b/packages/theme/modules/customer/components/LoginModal/forms/__tests__/ForgotPasswordForm.spec.ts new file mode 100644 index 000000000..b51443e5d --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/__tests__/ForgotPasswordForm.spec.ts @@ -0,0 +1,29 @@ +import { render } from '@testing-library/vue'; +import userEvent from '@testing-library/user-event'; + +import ForgotPasswordFragment from '../ForgotPasswordForm.vue'; +import { ForgotPasswordFormFields } from '../types'; + +describe('ForgotPasswordForm', () => { + it('emits submit if validation passes', async () => { + const form : ForgotPasswordFormFields = { username: 'john@smith.com' }; + const { emitted, getByTestId } = render(ForgotPasswordFragment, { props: { form } }); + await userEvent.click(getByTestId('login-forgot-password-form-submit')); + const [submitEventPayload] = emitted().submit; + expect(submitEventPayload[0]).toStrictEqual(form); + }); + + it('requires non-empty email', async () => { + const form : ForgotPasswordFormFields = { username: '' }; + const { getByText, getByTestId } = render(ForgotPasswordFragment, { props: { form } }); + await userEvent.click(getByTestId('login-forgot-password-form-submit')); + getByText('This field is required'); + }); + + it('requires valid e-mail address', async () => { + const form : ForgotPasswordFormFields = { username: 'not_an_email' }; + const { getByTestId, getByText } = render(ForgotPasswordFragment, { props: { form } }); + await userEvent.click(getByTestId('login-forgot-password-form-submit')); + getByText('Invalid email'); + }); +}); diff --git a/packages/theme/modules/customer/components/LoginModal/forms/__tests__/LoginForm.spec.ts b/packages/theme/modules/customer/components/LoginModal/forms/__tests__/LoginForm.spec.ts new file mode 100644 index 000000000..47b7bffca --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/__tests__/LoginForm.spec.ts @@ -0,0 +1,66 @@ +import { render } from '@testing-library/vue'; +import userEvent from '@testing-library/user-event'; +import LoginForm from '../LoginForm.vue'; +import { LoginFormFields } from '../types'; + +describe('LoginForm', () => { + it('emits submit if validation passes', async () => { + const form : LoginFormFields = { + email: 'john@smith.com', + password: '123123', + }; + const { emitted, getByTestId } = render(LoginForm, { props: { form } }); + await userEvent.click(getByTestId('login-form-submit')); + const [submitEventPayload] = emitted().submit; + expect(submitEventPayload[0]).toStrictEqual(form); + }); + + it('requires non-empty email', async () => { + const form : LoginFormFields = { + email: '', + password: '123123', + }; + const { getByTestId, getByText } = render(LoginForm, { props: { form } }); + const submitButton = getByTestId('login-form-submit'); + await userEvent.click(submitButton); + getByText('This field is required'); + }); + + it('requires valid e-mail adddress', async () => { + const form : LoginFormFields = { + email: 'not_an_email', + password: '123123', + }; + const { getByTestId, getByText } = render(LoginForm, { props: { form } }); + await userEvent.click(getByTestId('login-form-submit')); + getByText('Invalid email'); + }); + + it('requires non-empty password', async () => { + const form : LoginFormFields = { + email: 'john@smith.com', + password: '', + }; + const { getByTestId, getByText } = render(LoginForm, { props: { form } }); + await userEvent.click(getByTestId('login-form-submit')); + getByText('This field is required'); + }); + + it('displays recaptcha', async () => { + const form : LoginFormFields = { + email: 'john@smith.com', + password: '123123', + }; + const { getByTestId } = render(LoginForm, { + props: { + form, + showRecaptcha: true, + }, + stubs: { + recaptcha: { template: '
recaptcha
' }, + }, + }); + await userEvent.click(getByTestId('login-form-submit')); + getByTestId('recaptcha'); + }); +}); diff --git a/packages/theme/modules/customer/components/LoginModal/forms/__tests__/RegisterForm.spec.ts b/packages/theme/modules/customer/components/LoginModal/forms/__tests__/RegisterForm.spec.ts new file mode 100644 index 000000000..b96588ea8 --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/__tests__/RegisterForm.spec.ts @@ -0,0 +1,51 @@ +import { render } from '@testing-library/vue'; +import userEvent from '@testing-library/user-event'; + +import RegisterForm from '../RegisterForm.vue'; +import { RegisterFormFields } from '../types'; + +describe('RegisterForm', () => { + it('requires fields', async () => { + const form : RegisterFormFields = { + email: '', + firstName: '', + lastName: '', + password: '', + shouldSubscribeToNewsletter: false, + isWillToCreateAccountConfirmed: true, + }; + const { emitted, getByTestId, getAllByText } = render(RegisterForm, { props: { form } }); + await userEvent.click(getByTestId('login-form-submit')); + expect(emitted().submit).not.toBeDefined(); + expect(getAllByText('This field is required')).toHaveLength(4); + }); + it('requires correct format of fields', async () => { + const form : RegisterFormFields = { + email: 'not_an_email', + firstName: 'John', + lastName: 'Smith', + password: '1', + shouldSubscribeToNewsletter: false, + isWillToCreateAccountConfirmed: true, + }; + const { emitted, getByTestId, getByText } = render(RegisterForm, { props: { form } }); + await userEvent.click(getByTestId('login-form-submit')); + expect(emitted().submit).not.toBeDefined(); + getByText(/The password must be at least/); + getByText('Invalid email'); + }); + it('emits submit if validation passes', async () => { + const form : RegisterFormFields = { + email: 'john@smith.com', + firstName: 'John', + lastName: 'Smith', + password: 'P@ssw0rd!', + shouldSubscribeToNewsletter: false, + isWillToCreateAccountConfirmed: true, + }; + const { emitted, getByTestId } = render(RegisterForm, { props: { form } }); + await userEvent.click(getByTestId('login-form-submit')); + const [submitEventPayload] = emitted().submit; + expect(submitEventPayload[0]).toStrictEqual(form); + }); +}); diff --git a/packages/theme/modules/customer/components/LoginModal/forms/styles.scss b/packages/theme/modules/customer/components/LoginModal/forms/styles.scss new file mode 100644 index 000000000..cc767032b --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/styles.scss @@ -0,0 +1,19 @@ +.form { + margin-top: var(--spacer-sm); + + &__element { + margin: 0 0 var(--spacer-xl) 0; + } +} + +.action { + display: flex; + align-items: center; + justify-content: center; + margin: var(--spacer-xl) 0 var(--spacer-xl) 0; + font: var(--font-weight--light) var(--font-size--base) / 1.6 var(--font-family--secondary); + + & > * { + margin: 0 0 0 var(--spacer-xs); + } +} diff --git a/packages/theme/modules/customer/components/LoginModal/forms/types.ts b/packages/theme/modules/customer/components/LoginModal/forms/types.ts new file mode 100644 index 000000000..31c0ee2f5 --- /dev/null +++ b/packages/theme/modules/customer/components/LoginModal/forms/types.ts @@ -0,0 +1,15 @@ +export type LoginFormFields = { + email: string, + password: string, +}; +export type RegisterFormFields = { + email: string, + firstName: string, + lastName: string, + password: string, + shouldSubscribeToNewsletter: boolean, + isWillToCreateAccountConfirmed: boolean, +}; +export type ForgotPasswordFormFields = { + username: string, +}; diff --git a/packages/theme/package.json b/packages/theme/package.json index 8ccf86222..b53f6cc4d 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -67,9 +67,9 @@ "@nuxt/types": "latest", "@nuxt/typescript-build": "^2.1.0", "@pinia/testing": "^0.0.11", - "@testing-library/jest-dom": "^5.16.1", - "@testing-library/user-event": "^14.1.1", - "@testing-library/vue": "^5.8.2", + "@testing-library/jest-dom": "^5.16.4", + "@testing-library/user-event": "^14.2.0", + "@testing-library/vue": "^5.8.3", "@types/lodash.debounce": "^4.0.6", "@types/lodash.merge": "^4.6.7", "@types/lodash.unescape": "^4.0.7", diff --git a/packages/theme/types/vueTestingLibrary.ts b/packages/theme/types/vueTestingLibrary.ts new file mode 100644 index 000000000..b7598c2b9 --- /dev/null +++ b/packages/theme/types/vueTestingLibrary.ts @@ -0,0 +1,3 @@ +import type { ComponentInstance } from '@nuxtjs/composition-api'; + +export type HTMLElementWithVue = HTMLElement & { __vue__: ComponentInstance }; diff --git a/yarn.lock b/yarn.lock index be814a978..f90846ff6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3578,10 +3578,10 @@ lz-string "^1.4.4" pretty-format "^26.6.2" -"@testing-library/jest-dom@^5.16.1": - version "5.16.2" - resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.2.tgz#f329b36b44aa6149cd6ced9adf567f8b6aa1c959" - integrity sha512-6ewxs1MXWwsBFZXIk4nKKskWANelkdUehchEOokHsN8X7c2eKXGw+77aRV63UU8f/DTSVUPLaGxdrj4lN7D/ug== +"@testing-library/jest-dom@^5.16.4": + version "5.16.4" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.16.4.tgz#938302d7b8b483963a3ae821f1c0808f872245cd" + integrity sha512-Gy+IoFutbMQcky0k+bqqumXZ1cTGswLsFqmNLzNdSKkU9KGV2u9oXhukCbbJ9/LRPKiqwxEE8VpV/+YZlfkPUA== dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" @@ -3593,15 +3593,15 @@ lodash "^4.17.15" redent "^3.0.0" -"@testing-library/user-event@^14.1.1": - version "14.1.1" - resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.1.1.tgz#e1ff6118896e4b22af31e5ea2f9da956adde23d8" - integrity sha512-XrjH/iEUqNl9lF2HX9YhPNV7Amntkcnpw0Bo1KkRzowNDcgSN9i0nm4Q8Oi5wupgdfPaJNMAWa61A+voD6Kmwg== +"@testing-library/user-event@^14.2.0": + version "14.2.0" + resolved "https://registry.yarnpkg.com/@testing-library/user-event/-/user-event-14.2.0.tgz#8293560f8f80a00383d6c755ec3e0b918acb1683" + integrity sha512-+hIlG4nJS6ivZrKnOP7OGsDu9Fxmryj9vCl8x0ZINtTJcCHs2zLsYif5GzuRiBF2ck5GZG2aQr7Msg+EHlnYVQ== -"@testing-library/vue@^5.8.2": - version "5.8.2" - resolved "https://registry.yarnpkg.com/@testing-library/vue/-/vue-5.8.2.tgz#976b2179dc28ceba8dd63b5437edc2749f860252" - integrity sha512-evsQjLw3T/c92ZsXflZMzSN72P06VlgUZMIcrRKn5n9ZX7QgQyebB3DgdmPACf6JgNfP8Y3Lm2212FmeMnWlZw== +"@testing-library/vue@^5.8.3": + version "5.8.3" + resolved "https://registry.yarnpkg.com/@testing-library/vue/-/vue-5.8.3.tgz#c56e9eac598bdf6f5e0309799c538e815ddc0b59" + integrity sha512-M6+QqP1xuFHixKOeXF9pCLbtiyJZRKfJRP+unBf6Ljm7aS1V2CSS95oTetFoblaj0W1+AC9XJgwmUDtlLoaakQ== dependencies: "@babel/runtime" "^7.12.5" "@testing-library/dom" "^7.26.6" From 81b1506152f93953ffdd366c366f28d4bfb04092 Mon Sep 17 00:00:00 2001 From: Artur Tagisow Date: Wed, 8 Jun 2022 09:19:44 +0200 Subject: [PATCH 476/486] refactor: use one navigation event instead of many I don't like this commit because this couples the loginmodal logic to the respective forms (they shouldn't know anything about loginmodal's page logic), but reviewers think otherwise so --- .../components/LoginModal/LoginModal.vue | 11 +++++------ .../LoginModal/__tests__/LoginModal.spec.ts | 12 +++++++----- .../components/LoginModal/forms/LoginForm.vue | 17 ++++++++++++----- .../LoginModal/forms/RegisterForm.vue | 15 +++++++++++---- .../components/LoginModal/forms/types.ts | 2 ++ 5 files changed, 37 insertions(+), 20 deletions(-) diff --git a/packages/theme/modules/customer/components/LoginModal/LoginModal.vue b/packages/theme/modules/customer/components/LoginModal/LoginModal.vue index 0c005bee9..1a5801f8d 100644 --- a/packages/theme/modules/customer/components/LoginModal/LoginModal.vue +++ b/packages/theme/modules/customer/components/LoginModal/LoginModal.vue @@ -25,8 +25,7 @@ :loading="loading" :form="loginForm" @submit="form => onLoginFormSubmit(form)" - @go-to-register="currentlyDisplayedForm = 'register'" - @go-to-forgot-password="currentlyDisplayedForm = 'forgotPassword'" + @change-form="currentlyDisplayedForm = $event" >